using Amazon.Runtime.Internal.Util ;
using DS.Module.SqlSugar ;
using DS.Module.UserModule ;
using DS.WMS.Core.Op.Dtos ;
using DS.WMS.Core.Op.Entity ;
using DS.WMS.Core.Op.Interface ;
using DS.WMS.Core.Sys.Entity ;
using DS.WMS.Core.Sys.Interface ;
using Microsoft.Extensions.DependencyInjection ;
using SqlSugar ;
using NLog ;
using NLog.Web ;
using DS.Module.Core.Extensions ;
using Logger = NLog . Logger ;
using Mapster ;
using Microsoft.AspNetCore.Identity ;
using DS.Module.Core.Constants ;
using Microsoft.AspNetCore.Http ;
using Newtonsoft.Json ;
namespace DS.WMS.Core.Op.Method
{
public class DataCallBackService : IDataCallBackService
{
private readonly IServiceProvider _serviceProvider ;
private readonly ISqlSugarClient db ;
private readonly IUser user ;
private readonly ISaasDbService saasService ;
private readonly ICommonService commonService ;
private readonly ISeaExportCommonService seaComService ;
private readonly IHttpContextAccessor accessor ;
private static readonly Logger _logger = LogManager . GetCurrentClassLogger ( ) ;
/// <summary>
///
/// </summary>
/// <param name="serviceProvider"></param>
public DataCallBackService ( IServiceProvider serviceProvider )
{
_serviceProvider = serviceProvider ;
db = _serviceProvider . GetRequiredService < ISqlSugarClient > ( ) ;
user = _serviceProvider . GetRequiredService < IUser > ( ) ;
saasService = _serviceProvider . GetRequiredService < ISaasDbService > ( ) ;
commonService = _serviceProvider . GetRequiredService < ICommonService > ( ) ;
seaComService = _serviceProvider . GetRequiredService < ISeaExportCommonService > ( ) ;
accessor = _serviceProvider . GetRequiredService < IHttpContextAccessor > ( ) ;
}
/// <summary>
/// 插入货运动态
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
public async Task AddBookingStatusLog ( List < BookingStatusLogReq > req )
{
try
{
// 当BusinessId不为空时, 将BusinessId的值转为订舱主键; 否则仍然使用BookingId作为订舱记录主键
if ( ! string . IsNullOrEmpty ( req [ 0 ] . BusinessId ) )
{
if ( long . TryParse ( req [ 0 ] . BusinessId , out long itemBusinessId ) )
{
req [ 0 ] . BookingId = itemBusinessId ;
}
else
{
_logger . Error ( $"在将item.BusinessId转为BookingId时发生异常, 货运动态插入失败; item.BusinessId的值为: {req[0].BusinessId}" ) ;
return ;
}
}
_logger . Info ( $"货运动态回调:" + JsonConvert . SerializeObject ( req ) ) ;
//订舱状态
var dicList = db . Queryable < SysDictData > ( ) . Where ( x = > x . TypeId = = 1788810332945387520 ) . ToList ( ) ;
foreach ( var item in req )
{
// 当BusinessId不为空时, 将BusinessId的值转为订舱主键; 否则仍然使用BookingId作为订舱记录主键
if ( ! string . IsNullOrEmpty ( item . BusinessId ) )
{
if ( long . TryParse ( item . BusinessId , out long itemBusinessId ) )
{
item . BookingId = itemBusinessId ;
}
else
{
_logger . Error ( $"在将item.BusinessId转为BookingId时发生异常, 货运动态插入失败; item.BusinessId的值为: {item.BusinessId}" ) ;
continue ;
}
}
var tenantId = accessor . HttpContext . Request . Headers [ "PushBackKey" ] . FirstOrDefault ( ) ;
var tenantDb = saasService . GetBizDbScopeById ( tenantId ) ;
var businessId = item . BookingId ;
//TODO
var list = await tenantDb . Queryable < BookingStatus > ( ) . Filter ( null , true )
. InnerJoin < SysDictData > ( ( d , t ) = > d . StatusCode = = t . Value & & t . TypeId = = 1788810332945387520 & & d . StatusGroup = = "booking_status_group_billtrace"
& & d . BusinessId = = businessId , "shippingweb8_dev.sys_dict_data" )
. Select ( ( d , t ) = > new
{
BusinessId = d . BusinessId ,
StatusCode = d . StatusCode ,
StatusName = d . StatusName ,
StatusTime = d . StatusTime ,
Name = t . Name ,
Value = t . Value
} ) . ToListAsync ( ) ;
// var list = await tenantDb.Queryable<BookingStatus>().Filter(null, true).Where(x=>x.StatusGroup == "booking_status_group_billtrace" && x.BusinessId == businessId).Select(d=> new
//{
// BusinessId = d.BusinessId,
// StatusCode = d.StatusCode,
// StatusName = d.StatusName,
// StatusTime = d.StatusTime
//}).ToListAsync();
var oldLog = await tenantDb . Queryable < BookingStatusLog > ( ) . Where ( x = > x . BusinessId = = businessId & & x . Group = = "yunzong" ) . FirstAsync ( ) ;
if ( oldLog . IsNotNull ( ) ) {
//删除日志详情和日志
var oldLogDetails = await tenantDb . Queryable < BookingStatusLogDetail > ( ) . Where ( x = > x . PId = = oldLog . Id ) . ToListAsync ( ) ;
if ( oldLogDetails . Count > 0 )
{
await tenantDb . Deleteable ( oldLogDetails ) . ExecuteCommandAsync ( ) ;
}
await tenantDb . Deleteable ( oldLog ) . ExecuteCommandAsync ( ) ;
}
#region 日志
//新增数据
var statusLog = new BookingStatusLog ( )
{
BusinessId = businessId ,
Group = "yunzong" ,
Status = item . Status ,
OpTime = item . OpTime ,
MBLNO = item . MBLNO
} ;
await tenantDb . Insertable ( statusLog ) . ExecuteCommandAsync ( ) ;
if ( item . detail ! = null & & item . detail . Count > 0 )
{
foreach ( var dt in item . detail )
{
var logDetail = new BookingStatusLogDetail ( )
{
PId = statusLog . Id ,
Status = dt . Status ,
CNTRNO = dt . CNTRNO ,
OpTime = dt . OPTime
} ;
await tenantDb . Insertable ( logDetail ) . ExecuteCommandAsync ( ) ;
}
}
if ( item . Status = = "提箱" )
{
//自动引入场站箱型箱量数据
//await _bookingorderservice.AutoYardData(item.BookingId);
//#region 推送已提箱状态
////2023-12-28 JHQ 增加提箱推送状态
//DateTime opTime = DateTime.MinValue;
//if (item.detail != null && item.detail.Count > 0 && item.detail.Any(x => x.OPTime.HasValue))
// opTime = item.detail.Where(x => x.OPTime.HasValue).Max(x => x.OPTime.Value);
//var pushModel = new ModifyServiceProjectStatusDto
//{
// BookingId = businessId,
// SourceType = TrackingSourceTypeEnum.AUTO,
// StatusCodes = new List<ModifyServiceProjectStatusDetailDto> {
// new ModifyServiceProjectStatusDetailDto { StatusCode = "YTX" } }
//};
//if (opTime != DateTime.MinValue)
//{
// pushModel.StatusCodes[0].SetActDate = opTime;
//}
//var saveStatusRlt = await _bookingValueAddedService.SaveServiceStatus(pushModel);
//_logger.Info("请求JSON={json} 异步推送服务状态完成,结果={rlt}", JSON.Serialize(pushModel), JSON.Serialize(saveStatusRlt));
//#endregion
}
# endregion
#region 订舱状态
if ( item . Status = = "舱单" )
{
if ( list . Where ( x = > x . Value = = "status_cangdan" ) . FirstOrDefault ( ) = = null )
{
var bookingStatus = new BookingStatus ( )
{
BusinessId = businessId ,
StatusCode = "status_cangdan" ,
StatusName = dicList . Where ( x = > x . Value = = "status_cangdan" ) . Select ( x = > x . Name ) . First ( ) ,
StatusTime = item . OpTime ,
StatusGroup = "booking_status_group_billtrace"
} ;
await tenantDb . Insertable ( bookingStatus ) . ExecuteCommandAsync ( ) ;
//2023-12-28 JHQ 增加舱单放行推送状态
await seaComService . SetGoodsStatus ( "CDFX" , item . BookingId , tenantDb ) ;
}
}
if ( item . Status = = "海关放行" )
{
if ( list . Where ( x = > x . Value = = "status_haifang" ) . FirstOrDefault ( ) = = null )
{
var bookingStatus = new BookingStatus ( )
{
BusinessId = businessId ,
StatusCode = "status_haifang" ,
StatusName = dicList . Where ( x = > x . Value = = "status_haifang" ) . Select ( x = > x . Name ) . First ( ) ,
StatusTime = item . OpTime ,
StatusGroup = "booking_status_group_billtrace"
} ;
await tenantDb . Insertable ( bookingStatus ) . ExecuteCommandAsync ( ) ;
await seaComService . SetGoodsStatus ( "BG" , item . BookingId , tenantDb ) ;
}
}
if ( item . Status = = "装载" )
{
if ( list . Where ( x = > x . Value = = "status_zhuangzai" ) . FirstOrDefault ( ) = = null )
{
var bookingStatus = new BookingStatus ( )
{
BusinessId = businessId ,
StatusCode = "status_zhuangzai" ,
StatusName = dicList . Where ( x = > x . Value = = "status_zhuangzai" ) . Select ( x = > x . Name ) . First ( ) ,
StatusTime = item . OpTime ,
StatusGroup = "booking_status_group_billtrace"
} ;
await tenantDb . Insertable ( bookingStatus ) . ExecuteCommandAsync ( ) ;
await seaComService . SetGoodsStatus ( "ZZFX" , item . BookingId , tenantDb ) ;
}
}
if ( item . Status = = "码放" )
{
if ( list . Where ( x = > x . Value = = "status_mafang" ) . FirstOrDefault ( ) = = null )
{
var bookingStatus = new BookingStatus ( )
{
BusinessId = businessId ,
StatusCode = "status_mafang" ,
StatusName = dicList . Where ( x = > x . Value = = "status_mafang" ) . Select ( x = > x . Name ) . First ( ) ,
StatusTime = item . OpTime ,
StatusGroup = "booking_status_group_billtrace"
} ;
await tenantDb . Insertable ( bookingStatus ) . ExecuteCommandAsync ( ) ;
await seaComService . SetGoodsStatus ( "MTFX" , item . BookingId , tenantDb ) ;
}
}
if ( item . Status = = "装船" )
{
if ( list . Where ( x = > x . Value = = "status_zhuangchuan" ) . FirstOrDefault ( ) = = null )
{
var bookingStatus = new BookingStatus ( )
{
BusinessId = businessId ,
StatusCode = "status_zhuangchuan" ,
StatusName = dicList . Where ( x = > x . Value = = "status_zhuangchuan" ) . Select ( x = > x . Name ) . First ( ) ,
StatusTime = item . OpTime ,
StatusGroup = "booking_status_group_billtrace"
} ;
await tenantDb . Insertable ( bookingStatus ) . ExecuteCommandAsync ( ) ;
}
}
if ( item . Status = = "ATD" )
{
if ( list . Where ( x = > x . Value = = "status_atd" ) . FirstOrDefault ( ) = = null )
{
var bookingStatus = new BookingStatus ( )
{
BusinessId = businessId ,
StatusCode = "status_atd" ,
StatusName = dicList . Where ( x = > x . Value = = "status_atd" ) . Select ( x = > x . Name ) . First ( ) ,
StatusTime = item . OpTime ,
StatusGroup = "booking_status_group_billtrace"
} ;
await tenantDb . Insertable ( bookingStatus ) . ExecuteCommandAsync ( ) ;
}
}
if ( item . Status = = "MDGETA" )
{
if ( list . Where ( x = > x . Value = = "status_mdgeta" ) . FirstOrDefault ( ) = = null )
{
var bookingStatus = new BookingStatus ( )
{
BusinessId = businessId ,
StatusCode = "status_mdgeta" ,
StatusName = dicList . Where ( x = > x . Value = = "status_mdgeta" ) . Select ( x = > x . Name ) . First ( ) ,
StatusTime = item . OpTime ,
StatusGroup = "booking_status_group_billtrace"
} ;
await tenantDb . Insertable ( bookingStatus ) . ExecuteCommandAsync ( ) ;
}
var order = tenantDb . Queryable < SeaExport > ( ) . Filter ( null , true ) . Where ( x = > x . Id = = businessId & & x . Deleted = = false ) . First ( ) ;
if ( order . ETA ! = item . OpTime & & item . OpTime ! = null )
{
order . ETA = item . OpTime ;
order . Note = "运踪回调更新ETA" ;
await tenantDb . Updateable ( order ) . UpdateColumns ( x = > new
{
x . ETA ,
x . Note
} ) . EnableDiffLogEvent ( ) . ExecuteCommandAsync ( ) ;
}
}
if ( item . Status = = "MDGATA" )
{
if ( list . Where ( x = > x . Value = = "status_mdgata" ) . FirstOrDefault ( ) = = null )
{
var bookingStatus = new BookingStatus ( )
{
BusinessId = businessId ,
StatusCode = "status_mdgata" ,
StatusName = dicList . Where ( x = > x . Value = = "status_mdgata" ) . Select ( x = > x . Name ) . First ( ) ,
StatusTime = item . OpTime ,
StatusGroup = "booking_status_group_billtrace"
} ;
await tenantDb . Insertable ( bookingStatus ) . ExecuteCommandAsync ( ) ;
}
var order = tenantDb . Queryable < SeaExport > ( ) . Filter ( null , true ) . Where ( x = > x . Id = = businessId & & x . Deleted = = false ) . First ( ) ;
if ( order . ATA ! = item . OpTime & & item . OpTime ! = null )
{
order . ATA = item . OpTime ;
order . Note = "运踪回调更新ATA" ;
await tenantDb . Updateable ( order ) . UpdateColumns ( x = > new
{
x . ATA ,
x . Note
} ) . EnableDiffLogEvent ( ) . ExecuteCommandAsync ( ) ;
}
}
#region 入港时间
if ( item . Status = = "入港" )
{
if ( list . Where ( x = > x . Value = = "status_rugang" ) . FirstOrDefault ( ) = = null )
{
var bookingStatus = new BookingStatus ( )
{
BusinessId = businessId ,
StatusCode = "status_rugang" ,
StatusName = dicList . Where ( x = > x . Value = = "status_rugang" ) . Select ( x = > x . Name ) . First ( ) ,
StatusTime = item . OpTime ,
StatusGroup = "booking_status_group_billtrace"
} ;
await tenantDb . Insertable ( bookingStatus ) . ExecuteCommandAsync ( ) ;
await seaComService . SetGoodsStatus ( "YRG" , item . BookingId , tenantDb ) ;
}
}
# endregion
# endregion
#region 船舶动态: ATD ETD ATA ETA MDGETA MDGATA
if ( item . Status = = "ATD" | | item . Status = = "ETD" | | item . Status = = "ATA" | | item . Status = = "ETA" | | item . Status = = "MDGETA" | | item . Status = = "MDGATA" )
{
var config = await db . Queryable < SysConfig > ( ) . FirstAsync ( x = > x . Code = = TenantParamCode . ENABLE_STATUS_TO_SAILING_DATE ) ;
if ( config . IsNotNull ( ) & & config . Value = = "YES" )
{
var order = await tenantDb . Queryable < SeaExport > ( ) . Where ( x = > x . Id = = businessId & & x . MBLNO = = item . MBLNO ) . FirstAsync ( ) ;
if ( item . Status = = "ATD" )
{
//2023-8-31, 排查单号为177GZHZHQ5711V的数据, 原来录入的船已开船, 运踪港前不再查询, 而因订阅港后数据会继续回推数据, 所以导致ATD被改
//因此, 暂时取消运踪回推时写入ATD, 还是以船期表查询为准
// 2024-4-8 因为港捷需要,重新开启,并通过租户参数判断
//变更ATD
if ( order ! = null & & item . OpTime ! = null & & order . ATD ! = item . OpTime )
{
order . ATD = item . OpTime ;
order . Note = "运踪回调更新ATD" ;
await tenantDb . Updateable ( order ) . UpdateColumns ( x = > new
{
x . ATD ,
x . Note
} ) . EnableDiffLogEvent ( ) . ExecuteCommandAsync ( ) ;
//sendDsList.Add(item.BookingId);
//await _bookingorderservice.SaveLog(newOrder, oldOrder, "运踪更新船期");
}
/ *
* 2023 年 8 月 24 日 改 , 取 消 运 踪 回 推 ATD 的 批 量 更 新 功 能
* 和 川 操 作 经 常 修 改 提 单 号 和 船 名 航 次 , 但 修 改 时 间 会 差 好 几 天 , 导 致 运 踪 根 据 提 单 号 查 询 的 数 据 , 回 写 回 来 之 后 , 再 根 据 船 名 航 次 去 批 量 更 新 数 据 时 , 错 误 的 把 其 他 数 据 修 改 了
* 因 此 , 不 能 根 据 船 名 航 次 去 批 量 修 改 数 据 , 因 为 操 作 写 的 船 名 航 次 可 能 是 错 误 的 , 导 致 把 他 人 的 数 据 修 改 错 误
* /
////批量变更相同船期
//if (!string.IsNullOrEmpty(o.VESSEL) && !string.IsNullOrEmpty(o.VOYNO) && !string.IsNullOrEmpty(o.CARRIERID))
//{
// var order = await _rep.AsQueryable().Filter(null, true).Where(x => x.VOYNO == o.VOYNO && x.VESSEL == o.VESSEL && x.CARRIERID == o.CARRIERID && x.TenantId == o.TenantId && x.IsDeleted == false && x.Id != item.BookingId).ToListAsync();
// foreach (var it in order)
// {
// var _oldorder = it;
// var _oldatd = it.ATD;
// if (_oldatd != item.OpTime)
// {
// it.ATD = item.OpTime;
// await _rep.UpdateAsync(it);
// await _bookingorderservice.SaveLog(it, _oldorder);
// await _bookingorderservice.SendBookingOrder(new long[] { it.Id });
// }
// }
//}
}
else if ( item . Status = = "ETD" )
{
if ( order ! = null & & item . OpTime ! = null & & order . YgtETD ! = item . OpTime )
{
order . YgtETD = item . OpTime ;
order . Note = "运踪回调更新YgtETD" ;
await tenantDb . Updateable ( order ) . UpdateColumns ( x = > new
{
x . YgtETD , x . Note
} ) . EnableDiffLogEvent ( ) . ExecuteCommandAsync ( ) ;
//await _bookingorderservice.SaveLog(newOrder, oldOrder, "运踪更新船期");
}
}
else if ( item . Status = = "ATA" )
{
if ( order ! = null & & item . OpTime ! = null & & order . StartATA ! = item . OpTime )
{
order . StartATA = item . OpTime ;
order . Note = "运踪回调更新StartATA" ;
await tenantDb . Updateable ( order ) . UpdateColumns ( x = > new
{
x . StartATA , x . Note
} ) . EnableDiffLogEvent ( ) . ExecuteCommandAsync ( ) ;
//await _bookingorderservice.SaveLog(newOrder, oldOrder, "运踪更新船期");
}
}
else if ( item . Status = = "ETA" )
{
if ( order ! = null & & item . OpTime ! = null & & order . StartETA ! = item . OpTime )
{
order . StartETA = item . OpTime ;
order . Note = "运踪回调更新StartETA" ;
await tenantDb . Updateable ( order ) . UpdateColumns ( x = > new
{
x . StartETA , x . Note
} ) . EnableDiffLogEvent ( ) . ExecuteCommandAsync ( ) ;
//await _bookingorderservice.SaveLog(newOrder, oldOrder, "运踪更新船期");
}
}
else if ( item . Status = = "MDGETA" )
{
if ( order ! = null & & item . OpTime ! = null & & order . ETA ! = item . OpTime )
{
order . ETA = item . OpTime ;
order . Note = "运踪回调更新ETA" ;
await tenantDb . Updateable ( order ) . UpdateColumns ( x = > new
{
x . ETA , x . Note
} ) . EnableDiffLogEvent ( ) . ExecuteCommandAsync ( ) ;
//await _bookingorderservice.SaveLog(newOrder, oldOrder, "运踪更新船期");
}
}
else if ( item . Status = = "MDGATA" )
{
if ( order ! = null & & item . OpTime ! = null & & order . ATA ! = item . OpTime )
{
order . ATA = item . OpTime ;
order . Note = "运踪回调更新ATA" ;
await tenantDb . Updateable ( order ) . UpdateColumns ( x = > new
{
x . ATA , x . Note
} ) . EnableDiffLogEvent ( ) . ExecuteCommandAsync ( ) ;
//await _bookingorderservice.SaveLog(newOrder, oldOrder, "运踪更新船期");
}
}
}
}
# endregion
}
}
catch ( Exception ex )
{
_logger . Error ( ex . Message ) ;
_logger . Error ( ex . StackTrace ) ;
}
}
}
}