@ -5,13 +5,18 @@ using Furion.DistributedIDGenerator;
using Furion.FriendlyException ;
using Furion.JsonSerialization ;
using Furion.RemoteRequest.Extensions ;
using Microsoft.AspNetCore.Mvc ;
using Microsoft.Extensions.DependencyInjection ;
using Microsoft.Extensions.Logging ;
using ServiceProjectSyncWin ;
using ServiceProjectSyncWin.Entities ;
using SqlSugar ;
using System.Collections.Specialized ;
using System.ComponentModel.DataAnnotations ;
using System.Net.Http.Headers ;
using System.Text ;
using System.Text.RegularExpressions ;
using System.Web ;
using static System . Net . Mime . MediaTypeNames ;
Serve . RunGeneric ( additional : services = >
@ -426,9 +431,903 @@ public class SyncHisRecord: ISyncHisRecord,ITransient
1 、 更 新 任 务 台
2 、 更 新 舱 位 的 截 止 时 间 记 录
* /
//_db.Queryable<TaskBCEntity>().Max(a => a.ORG_STATUS_ID);
var taskList = _db . Queryable < TaskBCEntity > ( ) . Where ( a = > ( a . BUSI_TYPE = = "BookingConfirmation" | | a . BUSI_TYPE = = "BookingAmendment" ) & & a . TASK_ID = = "08dc56ae-e1bd-4650-818e-85447143df67" )
. OrderBy ( t = > t . CreatedTime )
. ToList ( ) ;
string batchNo = Guid . NewGuid ( ) . ToString ( ) ;
_logger . LogInformation ( $"批次={batchNo} 提取待处理任务 num={taskList.Count}" ) ;
string bcReadUrl = "http://localhost:5110/api/TaskBCParser/ExcuteBCFileRead" ;
string amendReadUrl = "http://localhost:5110/api/TaskBookingAmendmentParser/ExcuteBookingAmendmentRead" ;
//foreach (var task in taskList)
for ( int i = 0 ; i < taskList . Count ; i + + )
{
var task = taskList [ i ] ;
//BookingConfirmation、BookingAmendment
if ( task . BUSI_TYPE = = "BookingConfirmation" )
{
_logger . LogInformation ( $"批次={batchNo} 处理任务 No={i} MBLNO={task.MBL_NO} 开始" ) ;
var fileInfo = _db . Queryable < TaskFileEntities > ( ) . Where ( a = > a . TASK_PKID = = task . TASK_ID & & a . FILE_CATEGORY = = "BC" ) . First ( ) ;
if ( fileInfo ! = null )
{
_logger . LogInformation ( $"批次={batchNo} 提取待处理任务 MBLNO={task.MBL_NO} 取到文件" ) ;
string bcFileFullPath = $"D:\\djy\\backend\\wwwroot\\{fileInfo.FILE_PATH}" ;
var bcFileName = Path . GetFileName ( bcFileFullPath ) ;
TaskBCInfoReadDto BCReadInfo = GetBCReaderInfo ( bcFileFullPath , bcFileName , task . TenantId . Value , task . TASK_ID , bcReadUrl ) . GetAwaiter ( ) . GetResult ( ) ;
_logger . LogInformation ( $"批次={batchNo} 提取待处理任务 MBLNO={task.MBL_NO} 识别完文件 BCReadInfo={JSON.Serialize(BCReadInfo)}" ) ;
if ( BCReadInfo ! = null )
{
//SI_CUT_DATE
if ( BCReadInfo . SICutDate . HasValue )
{
if ( task . SI_CUT_DATE . HasValue & & task . SI_CUT_DATE . Value = = BCReadInfo . SICutDate . Value )
{
}
task . SI_CUT_DATE = BCReadInfo . SICutDate . Value ;
}
else
{
task . SI_CUT_DATE = null ;
}
//VGM_CUTOFF_TIME
if ( BCReadInfo . VGMCutoffTime . HasValue )
{
task . VGM_CUTOFF_TIME = BCReadInfo . VGMCutoffTime . Value ;
}
else
{
task . VGM_CUTOFF_TIME = null ;
}
//MANIFEST_CUT_DATE
if ( BCReadInfo . ManifestCutDate . HasValue )
{
task . MANIFEST_CUT_DATE = BCReadInfo . ManifestCutDate . Value ;
}
else
{
task . MANIFEST_CUT_DATE = null ;
}
//CY_CUTOFF_TIME
if ( BCReadInfo . CYCutoffTime . HasValue )
{
task . CY_CUTOFF_TIME = BCReadInfo . CYCutoffTime . Value ;
}
else
{
task . CY_CUTOFF_TIME = null ;
}
//MDGF_CUT_DATE
if ( BCReadInfo . MDGFCutDate . HasValue )
{
task . MDGF_CUT_DATE = BCReadInfo . MDGFCutDate . Value ;
}
else
{
task . MDGF_CUT_DATE = null ;
}
//CLOSING_DATE
if ( BCReadInfo . ClosingDate . HasValue )
{
task . CLOSING_DATE = BCReadInfo . ClosingDate . Value ;
}
else
{
task . CLOSING_DATE = null ;
}
_db . Updateable < TaskBCEntity > ( task ) . UpdateColumns ( it = > new
{
it . SI_CUT_DATE ,
it . VGM_CUTOFF_TIME ,
it . MANIFEST_CUT_DATE ,
it . CY_CUTOFF_TIME ,
it . MDGF_CUT_DATE ,
it . CLOSING_DATE
} ) . ExecuteCommand ( ) ;
}
}
}
else if ( task . BUSI_TYPE = = "BookingAmendment" )
{
var fileInfo = _db . Queryable < TaskFileEntities > ( ) . Where ( a = > a . TASK_PKID = = task . TASK_ID & & a . FILE_CATEGORY = = "BC_MODIFY" ) . First ( ) ;
if ( fileInfo ! = null )
{
string bcFileFullPath = $"D:\\djy\\backend\\wwwroot\\{fileInfo.FILE_PATH}" ;
var bcFileName = Path . GetFileName ( bcFileFullPath ) ;
TaskBCInfoReadDto BCReadInfo = GetBCReaderInfo ( bcFileFullPath , bcFileName , task . TenantId . Value , task . TASK_ID , amendReadUrl ) . GetAwaiter ( ) . GetResult ( ) ;
if ( BCReadInfo ! = null )
{
//SI_CUT_DATE
if ( BCReadInfo . SICutDate . HasValue )
{
task . SI_CUT_DATE = BCReadInfo . SICutDate . Value ;
}
else
{
task . SI_CUT_DATE = null ;
}
//VGM_CUTOFF_TIME
if ( BCReadInfo . VGMCutoffTime . HasValue )
{
task . VGM_CUTOFF_TIME = BCReadInfo . VGMCutoffTime . Value ;
}
else
{
task . VGM_CUTOFF_TIME = null ;
}
//MANIFEST_CUT_DATE
if ( BCReadInfo . ManifestCutDate . HasValue )
{
task . MANIFEST_CUT_DATE = BCReadInfo . ManifestCutDate . Value ;
}
else
{
task . MANIFEST_CUT_DATE = null ;
}
//CY_CUTOFF_TIME
if ( BCReadInfo . CYCutoffTime . HasValue )
{
task . CY_CUTOFF_TIME = BCReadInfo . CYCutoffTime . Value ;
}
else
{
task . CY_CUTOFF_TIME = null ;
}
//MDGF_CUT_DATE
if ( BCReadInfo . MDGFCutDate . HasValue )
{
task . MDGF_CUT_DATE = BCReadInfo . MDGFCutDate . Value ;
}
else
{
task . MDGF_CUT_DATE = null ;
}
//CLOSING_DATE
if ( BCReadInfo . ClosingDate . HasValue )
{
task . CLOSING_DATE = BCReadInfo . ClosingDate . Value ;
}
else
{
task . CLOSING_DATE = null ;
}
_db . Updateable < TaskBCEntity > ( task ) . UpdateColumns ( it = > new
{
it . SI_CUT_DATE ,
it . VGM_CUTOFF_TIME ,
it . MANIFEST_CUT_DATE ,
it . CY_CUTOFF_TIME ,
it . MDGF_CUT_DATE ,
it . CLOSING_DATE
} ) . ExecuteCommand ( ) ;
}
}
}
Thread . Sleep ( 500 ) ;
}
}
#region 读BC详情详情
/// <summary>
/// 读BC详情详情
/// </summary>
/// <param name="attachFullName">文件完整路径</param>
/// <param name="fileName">文件名称</param>
/// <param name="tenantId">所属租户</param>
/// <param name="taskPKId">任务ID</param>
/// <param name="url">请求URL</param>
/// <returns></returns>
private async Task < TaskBCInfoReadDto > GetBCReaderInfo ( string attachFullName , string fileName , long tenantId , string taskPKId , string url )
{
TaskBCInfoReadDto taskBCInfoReadDto = null ;
try
{
DateTime nowDate = DateTime . Now ;
EmailBCReadMessageInfo messageInfo = new EmailBCReadMessageInfo
{
Head = new TaskMessageHead
{
GID = IDGen . NextID ( ) . ToString ( ) ,
MessageType = "BOOKING_AMENDMENT" ,
SenderId = "DJY" ,
SenderName = "新大简云" ,
ReceiverId = "RulesEngine" ,
ReceiverName = "大简云规则引擎" ,
Version = "1.0" ,
RequestDate = nowDate . ToString ( "yyyy-MM-dd HH:mm:ss" ) ,
RequestAction = "ReadFile" ,
} ,
Main = new EmailBCReadMessageMainInfo
{
TenantId = tenantId > 0 ? tenantId . ToString ( ) : ""
}
} ;
NameValueCollection par = new NameValueCollection ( ) ;
par . Add ( "jsonData" , JSON . Serialize ( messageInfo ) ) ;
//解析BookingAmendment
var compareRlt = await ExcuteReadFile ( par , url , new
{
file = "file" ,
fileName = fileName ,
fileBytes = File . ReadAllBytes ( attachFullName )
} ) ;
_logger . LogInformation ( $"读取BC附件详情 taskPKId={taskPKId}, compareRlt={JSON.Serialize(compareRlt)}" ) ;
if ( compareRlt . succ )
{
taskBCInfoReadDto = JSON . Deserialize < TaskBCInfoReadDto > ( JSON . Serialize ( compareRlt . extra ) ) ;
}
}
catch ( Exception ex )
{
_logger . LogError ( $"读取BC附件详情异常, 原因: {ex.Message}" ) ;
}
return taskBCInfoReadDto ;
}
# endregion
#region 请求BookingAmendment解析
/// <summary>
/// 请求BookingAmendment解析
/// </summary>
/// <param name="nameValueCollection">请求参数</param>
/// <param name="url">请求url</param>
/// <param name="fileInfo">文件</param>
/// <param name="contentType">请求类型</param>
/// <returns>返回回执</returns>
[NonAction]
private async Task < ParserReaderExcuteResultDto > ExcuteReadFile ( NameValueCollection nameValueCollection , string url , dynamic fileInfo ,
string contentType = "application/json" )
{
ParserReaderExcuteResultDto model = null ;
var result = string . Empty ;
using ( var httpClient = new HttpClient ( ) )
{
try
{
using ( var reduceAttach = new MultipartFormDataContent ( ) )
{
string [ ] allKeys = nameValueCollection . AllKeys ;
foreach ( string key in allKeys )
{
var dataContent = new ByteArrayContent ( Encoding . UTF8 . GetBytes ( nameValueCollection [ key ] ) ) ;
dataContent . Headers . ContentDisposition = new ContentDispositionHeaderValue ( $"form-data" )
{
Name = key
} ;
reduceAttach . Add ( dataContent ) ;
}
#region 文件参数
if ( fileInfo ! = null )
{
var Content = new ByteArrayContent ( fileInfo . fileBytes ) ;
//Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
//{
// Name = fileInfo.file.ToString(),
// FileName = fileInfo.fileName.ToString(),
//};
Content . Headers . Add ( "Content-Type" , contentType ) ;
reduceAttach . Add ( Content , fileInfo . file . ToString ( ) , HttpUtility . UrlEncode ( fileInfo . fileName . ToString ( ) ) ) ;
}
# endregion
//httpClient.DefaultRequestHeaders.Add("USER_KEY", App.Configuration["ApiUserKey"]);
//httpClient.DefaultRequestHeaders.Add("USER_SECRET", App.Configuration["ApiUserSecret"]);
//请求
var response = httpClient . PostAsync ( url , reduceAttach ) . Result ;
result = response . Content . ReadAsStringAsync ( ) . Result ;
model = JSON . Deserialize < ParserReaderExcuteResultDto > ( result ) ;
}
}
catch ( Exception ex )
{
_logger . LogInformation ( "请求读取BC附件详情读取详情异常, 原因: {error}" , ex . Message ) ;
throw Oops . Oh ( $"请求读取BC附件详情读取详情异常, 原因: {ex.Message}" ) ;
}
}
return model ;
}
# endregion
public class EmailBCReadMessageInfo
{
/// <summary>
/// 表头
/// </summary>
public TaskMessageHead Head { get ; set ; }
/// <summary>
/// 表体
/// </summary>
public EmailBCReadMessageMainInfo Main { get ; set ; }
}
public class EmailBCReadMessageMainInfo
{
/// <summary>
/// 所属租户ID
/// </summary>
public string TenantId { get ; set ; }
}
public class TaskMessageHead : WebAPIHeadBase
{
}
public class WebAPIHeadBase
{
/// <summary>
/// 报文惟一主键
/// </summary>
/// <example>08dab66c-96a1-4f90-8606-2626e06202ad</example>
[Required(ErrorMessage = "必填")]
public string GID { get ; set ; }
/// <summary>
/// 报文类型 BUSI_RULE-业务规则校验
/// </summary>
/// <example>BUSI_RULE</example>
[Required(ErrorMessage = "必填")]
public string MessageType { get ; set ; }
/// <summary>
/// 发送方代码
/// </summary>
/// <example>CUSTOMER1</example>
[Required(ErrorMessage = "必填")]
public string SenderId { get ; set ; }
/// <summary>
/// 发送方名称
/// </summary>
/// <example>企业A</example>
[Required(ErrorMessage = "必填")]
public string SenderName { get ; set ; }
/// <summary>
/// 接收方代码
/// </summary>
/// <example>RulesEngine</example>
[Required(ErrorMessage = "必填")]
public string ReceiverId { get ; set ; }
/// <summary>
/// 接收方名称
/// </summary>
/// <example>大简云规则引擎</example>
[Required(ErrorMessage = "必填")]
public string ReceiverName { get ; set ; }
/// <summary>
/// 请求方登录TOKEN( 可以是真实的登录人TOKEN或者是服务模拟登录人TOKEN)
/// </summary>
/// <example>eyJhbGciOiJSUzI1NiIsImtpZCI6IkQ1RTkxMDI5OUU0RURFNUZEM0EwNTJBMEFDRDUzMUQzIiwidHlwIjoiYXQrand0In0</example>
public string Token { get ; set ; }
/// <summary>
/// 版本号 默认1.0
/// </summary>
/// <example>1.0</example>
[Required(ErrorMessage = "必填")]
public string Version { get ; set ; } = "1.0" ;
/// <summary>
/// 请求时间
/// </summary>
/// <example>2022-10-10 10:00:00</example>
public string RequestDate { get ; set ; }
/// <summary>
/// 请求操作类型
/// </summary>
/// <example>Add</example>
[Required(ErrorMessage = "必填")]
public string RequestAction { get ; set ; } = "Add" ;
}
}
public class ParserReaderExcuteResultDto
{
/// <summary>
/// 是否成功 true=成功 false=失败
/// </summary>
public bool succ { get ; set ; } = false ;
/// <summary>
/// 状态 0-成功
/// </summary>
public int status { get ; set ; } = 0 ;
/// <summary>
/// 返回消息
/// </summary>
public string msg { get ; set ; }
/// <summary>
/// 总记录数
/// </summary>
public int total { get ; set ; }
/// <summary>
/// 当前页列表数据
/// </summary>
public object rows { get ; set ; }
/// <summary>
/// 合计信息
/// </summary>
public object summary { get ; set ; }
/// <summary>
/// 扩展信息
/// </summary>
public object extra { get ; set ; }
/// <summary>
/// 扩展信息2
/// </summary>
public object extra2 { get ; set ; }
/// <summary>
/// 扩展信息场站统计
/// </summary>
public object yardStatInfo { get ; set ; }
/// <summary>
/// 是否异常
/// </summary>
public bool exceptionflag { get ; set ; }
/// <summary>
/// 生成HTML
/// </summary>
public string ResultHtml { get ; set ; }
}
/// <summary>
///
/// </summary>
public class TaskBCInfoReadDto
{
/// <summary>
/// 订舱单位
/// </summary>
public string BookingParty { get ; set ; }
/// <summary>
/// 发货人
/// </summary>
public string Shipper { get ; set ; }
/// <summary>
/// 收货人
/// </summary>
public string Consignee { get ; set ; }
/// <summary>
/// 通知人
/// </summary>
public string NotifyParty { get ; set ; }
/// <summary>
/// BC更新次数
/// </summary>
public Nullable < int > BCModifyTimes { get ; set ; }
/// <summary>
/// BC更新时间
/// </summary>
public Nullable < DateTime > BCModifyDate { get ; set ; }
/// <summary>
/// 主单号
/// </summary>
public string MBLNo { get ; set ; }
/// <summary>
/// 船名
/// </summary>
public string Vessel { get ; set ; }
/// <summary>
/// 航次
/// </summary>
public string VoyNo { get ; set ; }
/// <summary>
/// 船公司
/// </summary>
public string Carrier { get ; set ; }
/// <summary>
/// 收货地
/// </summary>
public string PlaceReceipt { get ; set ; }
/// <summary>
/// 装货港
/// </summary>
public string Portload { get ; set ; }
/// <summary>
/// 截关时间
/// </summary>
public Nullable < DateTime > ClosingDate { get ; set ; }
/// <summary>
/// 截VGM时间
/// </summary>
public Nullable < DateTime > VGMCutoffTime { get ; set ; }
/// <summary>
/// ETA(预计到港时间)
/// </summary>
public Nullable < DateTime > ETA { get ; set ; }
/// <summary>
/// ETD(预计离港时间)
/// </summary>
public Nullable < DateTime > ETD { get ; set ; }
/// <summary>
/// 目的港ETA
/// </summary>
public Nullable < DateTime > PODETA { get ; set ; }
/// <summary>
/// 截单时间
/// </summary>
public Nullable < DateTime > CutSingleTime { get ; set ; }
/// <summary>
/// 卸货港
/// </summary>
public string PortDischarge { get ; set ; }
/// <summary>
/// 交货地
/// </summary>
public string PlaceDelivery { get ; set ; }
/// <summary>
/// 装运方式
/// </summary>
public string ShippingMethod { get ; set ; }
/// <summary>
/// 运输条款
/// </summary>
public string Service { get ; set ; }
/// <summary>
/// 港前运输形态
/// </summary>
public string PreTransMode { get ; set ; }
/// <summary>
/// 品名
/// </summary>
public string Description { get ; set ; }
/// <summary>
/// 签单地点
/// </summary>
public string IssuePlace { get ; set ; }
/// <summary>
/// 集港码头
/// </summary>
public string CollectionTerminal { get ; set ; }
/// <summary>
/// 约号
/// </summary>
public string ContractNo { get ; set ; }
/// <summary>
/// 预付地点
/// </summary>
public string PrepardAT { get ; set ; }
/// <summary>
/// 船代
/// </summary>
public string ShipAgent { get ; set ; }
/// <summary>
/// 场站
/// </summary>
public string Yard { get ; set ; }
/// <summary>
/// 场站联系人
/// </summary>
public string YardContactUserName { get ; set ; }
/// <summary>
/// 场站联系电话
/// </summary>
public string YardContactTel { get ; set ; }
/// <summary>
/// 一代客服姓名
/// </summary>
public string FstCustomerSerUserName { get ; set ; }
/// <summary>
/// 一代客服电话
/// </summary>
public string FstCustomerSerUserTel { get ; set ; }
/// <summary>
/// 一代客服邮箱
/// </summary>
public string FstCustomerSerUserEmail { get ; set ; }
/// <summary>
/// 备注1
/// </summary>
public string Remark1 { get ; set ; }
/// <summary>
/// 截港时间
/// </summary>
public Nullable < DateTime > CYCutoffTime { get ; set ; }
/// <summary>
/// 状态 TEMP-暂存 SUCC-已对应 ERROR-异常
/// </summary>
public string Status { get ; set ; }
/// <summary>
/// 文件MD5
/// </summary>
public string FileMD5 { get ; set ; }
/// <summary>
/// 最后对应时间,最后关联到订舱日期
/// </summary>
public Nullable < DateTime > LastToBookingDate { get ; set ; }
/// <summary>
/// 来源邮箱
/// </summary>
public string FromEmail { get ; set ; }
/// <summary>
/// 接收邮箱
/// </summary>
public string RecvEmail { get ; set ; }
/// <summary>
/// 订舱ID, 对应成功后, 订舱ID写入
/// </summary>
public Nullable < long > BookingOrderId { get ; set ; }
/// <summary>
/// 集装箱列表
/// </summary>
public List < TaskBCInfoReadCtnDto > CtnList { get ; set ; }
/// <summary>
/// 顺序号
/// </summary>
public int Indx { get ; set ; }
/// <summary>
/// 对应订舱序号
/// </summary>
public int BKOrderIndx { get ; set ; }
/// <summary>
/// 舱位主键
/// </summary>
public Nullable < long > BookingSlotId { get ; set ; }
/// <summary>
/// 船公司代号
/// </summary>
public string CarrierId { get ; set ; }
/// <summary>
/// 航线代码(船公司)
/// </summary>
public string LaneCode { get ; set ; }
/// <summary>
/// 航线名称(船公司)
/// </summary>
public string LaneName { get ; set ; }
/// <summary>
/// 承运方式 DIRECT_SHIP-直达; TRANSFER_SHIP-中转
/// </summary>
public string CarriageType { get ; set ; }
/// <summary>
/// 承运方式名称 DIRECT_SHIP-直达; TRANSFER_SHIP-中转
/// </summary>
public string CarriageTypeName { get ; set ; }
/// <summary>
/// 订舱方式 CONTRACT_ORDER-合约订舱; SPOT_ORDER-SPOT订舱
/// </summary>
public string BookingSlotType { get ; set ; }
/// <summary>
/// 订舱方式名称 CONTRACT_ORDER-合约订舱; SPOT_ORDER-SPOT订舱
/// </summary>
public string BookingSlotTypeName { get ; set ; }
/// <summary>
/// 箱型箱量
/// </summary>
public string CtnStat { get ; set ; }
/// <summary>
/// 所在周数
/// </summary>
public string WeekAt { get ; set ; }
/// <summary>
/// 箱使天数
/// </summary>
public int DetensionFreeDays { get ; set ; }
/// <summary>
/// 样单截止日期
/// </summary>
public Nullable < DateTime > SICutDate { get ; set ; }
/// <summary>
/// 舱单截止时间
/// </summary>
public Nullable < DateTime > ManifestCutDate { get ; set ; }
/// <summary>
/// MDGF提交截止时间
/// </summary>
public Nullable < DateTime > MDGFCutDate { get ; set ; }
/// <summary>
/// 中转港1
/// </summary>
public string TransferPort1 { get ; set ; }
/// <summary>
/// 中转港2
/// </summary>
public string TransferPort2 { get ; set ; }
/// <summary>
/// 二程船名
/// </summary>
public string SecondVessel { get ; set ; }
/// <summary>
/// 二程航次
/// </summary>
public string SecondVoyno { get ; set ; }
/// <summary>
/// 二程ETD
/// </summary>
public Nullable < DateTime > SecondETD { get ; set ; }
/// <summary>
/// 二程ETA
/// </summary>
public Nullable < DateTime > SecondETA { get ; set ; }
/// <summary>
/// 订舱确认时间
/// </summary>
public Nullable < DateTime > BookingConfirmDate { get ; set ; }
}
/// <summary>
/// 任务BC集装箱
/// </summary>
public class TaskBCInfoReadCtnDto
{
/// <summary>
/// 箱型代码
/// </summary>
public string CtnCode { get ; set ; }
/// <summary>
/// 箱型
/// </summary>
public string CtnALL { get ; set ; }
/// <summary>
/// 箱量
/// </summary>
public Nullable < int > CTNNUM { get ; set ; }
/// <summary>
/// 件数
/// </summary>
public Nullable < int > PKGS { get ; set ; }
/// <summary>
/// 尺码
/// </summary>
public Nullable < decimal > CBM { get ; set ; }
/// <summary>
/// 毛重
/// </summary>
public Nullable < decimal > KGS { get ; set ; }
/// <summary>
/// 皮重
/// </summary>
public Nullable < decimal > TareWeight { get ; set ; }
/// <summary>
/// 危品票标示
/// </summary>
public string IODGT { get ; set ; }
/// <summary>
/// 特殊装载需求
/// </summary>
public string SpecialLoadingRequire { get ; set ; }
/// <summary>
/// 提箱场站
/// </summary>
public string TakeCTNYard { get ; set ; }
/// <summary>
/// 提箱时间
/// </summary>
public Nullable < DateTime > TakeCTNTime { get ; set ; }
/// <summary>
/// 还箱场站
/// </summary>
public string ReturnCTNYard { get ; set ; }
}