using log4net ;
using Newtonsoft.Json ;
using Quartz ;
using System ;
using System.Collections.Generic ;
using System.Data ;
using System.Data.SqlClient ;
using System.Linq ;
using System.Text ;
using JobAutoCreateFee.Model ;
using System.IO ;
namespace JobCreateFee
{
public class JobBcEdiReplyContrast : IJob
{
private ILog log = LogManager . GetLogger ( typeof ( JobBcEdiReplyContrast ) ) ;
public void Execute ( IJobExecutionContext context )
{
log . Debug ( $"Execute开始" ) ;
try
{
string connStr = context . JobDetail . JobDataMap . GetString ( "ConnectString" ) ;
string BcPath = context . JobDetail . JobDataMap . GetString ( "BcPath" ) ;
string tempPath = Path . Combine ( AppDomain . CurrentDomain . BaseDirectory , "BcTmp" ) ;
//string BcPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "BcPath");
if ( ! Directory . Exists ( tempPath ) )
{
Directory . CreateDirectory ( tempPath ) ;
}
string [ ] files = Directory . GetFiles ( BcPath ) ;
if ( files . Length > 0 )
{
foreach ( string file in files )
{
FileInfo fileInfo = new FileInfo ( file ) ;
string pathtxt = File . ReadAllText ( file ) ;
var opList = pathtxt . Split ( '\'' ) ;
var MBLNO = "" ;
var BSNO = "" ;
var PORTDISCHARGID = "" ;
var PORTDISCHARG = "" ;
var DESTINATIONID = "" ;
var DESTINATION = "" ;
var TMPSTR = "" ;
var CTNTYPE = "" ;
var CTNNUM = "" ;
int LOCCOUNT = 0 ;
var FILETYPE = "" ;
log . Debug ( $"文件名" + fileInfo . Name ) ;
var ctnlist = new List < JsonCtn > ( ) ;
foreach ( var opstr in opList )
{
var line = opstr ;
if ( string . IsNullOrEmpty ( line ) )
continue ;
var head = "" ;
if ( line . Length > = 3 )
head = line . Substring ( 0 , 3 ) ;
if ( head = = "RFF" )
{
var strtmp = GetPosStringplus ( line , 2 ) ;
var strtmp2 = GetPosString ( strtmp , 1 ) ;
string strRFF_Value = GetPosString ( strtmp , 2 ) ;
if ( strtmp2 = = "BN" ) {
BSNO = strRFF_Value ;
}
}
if ( head = = "LOC" )
{
var strtmp = GetPosStringplus ( line , 2 ) ;
var strtmp2 = GetPosStringplus ( line , 3 ) ;
if ( strtmp = = "11" )
{
var locValue1 = GetPosString ( strtmp2 , 1 ) ;
var locValue2 = GetPosString ( strtmp2 , 4 ) ;
if ( LOCCOUNT = = 0 )
{
PORTDISCHARGID = locValue1 ;
PORTDISCHARG = locValue2 ;
DESTINATIONID = locValue1 ;
DESTINATION = locValue2 ;
}
else {
DESTINATIONID = locValue1 ;
DESTINATION = locValue2 ;
}
LOCCOUNT = LOCCOUNT + 1 ;
}
}
if ( head = = "TMP" )
{
TMPSTR = GetPosString ( GetPosStringplus ( line , 3 ) , 1 ) ;
}
if ( head = = "EQD" )
{
CTNTYPE = GetPosStringplus ( line , 4 ) ;
}
if ( head = = "EQN" )
{
CTNNUM = GetPosStringplus ( line , 2 ) ;
var ctn = new JsonCtn ( ) ;
ctn . CTNTYPE = CTNTYPE ;
ctn . CTNNUM = CTNNUM ;
ctnlist . Add ( ctn ) ;
}
if ( head = = "BGM" )
{
FILETYPE = GetPosStringplus ( line , 5 ) ;
}
}
if ( ! string . IsNullOrEmpty ( BSNO ) & & FILETYPE = = "AP" )
{
log . Debug ( $"提单号:" + BSNO ) ;
var OPSEAE = GetOPSEAE ( connStr , BSNO ) ;
if ( OPSEAE ! = null & & ! string . IsNullOrEmpty ( OPSEAE . BSNO ) )
{
var ISBEUPDATE = false ;
var bodystr = "" ;
if ( OPSEAE . CTNLIST ! = null & & OPSEAE . CTNLIST . Count ! = 0 & & ctnlist ! = null & & ctnlist . Count ! = 0 )
{
foreach ( var ctn in OPSEAE . CTNLIST )
{
var isfind = false ;
ctnlist . ForEach ( i = >
{
if ( i . CTNTYPE = = ctn . CTNTYPE )
{
if ( i . CTNNUM ! = ctn . CTNNUM )
{
ISBEUPDATE = true ;
bodystr = bodystr + Environment . NewLine + "集装箱不一致:" + ctn . CTNTYPE + "*" + ctn . CTNNUM + "----" + i . CTNTYPE + "*" + i . CTNNUM ;
}
isfind = true ;
}
} ) ;
if ( ! isfind )
{
bodystr = bodystr + Environment . NewLine + "集装箱不一致:" + ctn . CTNTYPE + "*" + ctn . CTNNUM + "----" ;
ISBEUPDATE = true ;
}
}
}
else
{
bodystr = bodystr + Environment . NewLine + "集装箱不一致" ;
ISBEUPDATE = true ;
}
//if ((OPSEAE.PORTDISCHARG != PORTDISCHARG))
//{
// bodystr = bodystr + Environment.NewLine + "卸货港不一致:" + OPSEAE.PORTDISCHARG + "----" + PORTDISCHARG;
// ISBEUPDATE = true;
//}
if ( ( OPSEAE . PORTDISCHARGID ! = PORTDISCHARGID ) )
{
bodystr = bodystr + Environment . NewLine + "卸货港代码不一致:" + OPSEAE . PORTDISCHARGID + "----" + PORTDISCHARGID ;
ISBEUPDATE = true ;
}
if ( ( OPSEAE . DESTINATIONID ! = DESTINATIONID ) )
{
bodystr = bodystr + Environment . NewLine + "目的地代码不一致:" + OPSEAE . DESTINATIONID + "----" + DESTINATIONID ;
ISBEUPDATE = true ;
}
if ( ( OPSEAE . TMPSTR ! = TMPSTR ) )
{
bodystr = bodystr + Environment . NewLine + "温度不一致:" + OPSEAE . TMPSTR + "----" + TMPSTR ;
ISBEUPDATE = true ;
}
if ( ISBEUPDATE )
{
var stmpid = GetMailStmp ( connStr ) ;
SaveMail ( connStr , OPSEAE . EMAIL , "CMA订舱信息不一致:" + BSNO , bodystr , stmpid ) ;
}
}
if ( File . Exists ( Path . Combine ( tempPath , fileInfo . Name ) ) ) {
File . Delete ( Path . Combine ( tempPath , fileInfo . Name ) ) ;
}
File . Copy ( file , Path . Combine ( tempPath , fileInfo . Name ) ) ;
File . Delete ( file ) ;
}
else {
if ( File . Exists ( Path . Combine ( tempPath , fileInfo . Name ) ) )
{
File . Delete ( Path . Combine ( tempPath , fileInfo . Name ) ) ;
}
File . Copy ( file , Path . Combine ( tempPath , fileInfo . Name ) ) ;
File . Delete ( file ) ;
}
}
}
}
catch ( Exception ex )
{
log . Error ( ex . Message ) ;
log . Error ( ex . StackTrace ) ;
}
}
public static JsonOpSeae GetOPSEAE ( string connStr , string BSNO )
{
var result = new JsonOpSeae ( ) ;
var sqlQuery = $" select top 1 主提单号,编号,卸货港,卸货代码,目的地,目的地代码,isnull(设置温度,'') 设置温度,isnull((select top 1 邮箱 from t_sys_employee where 姓名=t_op_seae.操作员),'') 邮箱 from t_op_seae where 主提单号='{BSNO}' " ;
DataTable tQuery = QuerySql ( connStr , sqlQuery ) ;
if ( tQuery . Rows . Count > = 0 )
{
foreach ( DataRow row in tQuery . Rows )
{
result . PORTDISCHARG = row [ "卸货港" ] . ToString ( ) ;
result . PORTDISCHARGID = row [ "卸货代码" ] . ToString ( ) ;
result . TMPSTR = row [ "设置温度" ] . ToString ( ) ;
result . BSNO = row [ "编号" ] . ToString ( ) ;
result . EMAIL = row [ "邮箱" ] . ToString ( ) ;
result . DESTINATION = row [ "目的地" ] . ToString ( ) ;
result . DESTINATIONID = row [ "目的地代码" ] . ToString ( ) ;
sqlQuery = $" select t_code_ctn.EDI代码,sum(t_op_ctn.数量) 数量 from t_op_ctn INNER JOIN t_code_ctn ON t_op_ctn.代码 = t_code_ctn.代码 where t_op_ctn.编号='{result.BSNO}' GROUP BY t_code_ctn.EDI代码 " ;
var ctnlist = new List < JsonCtn > ( ) ;
DataTable ctnQuery = QuerySql ( connStr , sqlQuery ) ;
if ( ctnQuery . Rows . Count > = 0 )
{
foreach ( DataRow row2 in ctnQuery . Rows )
{
var ctn = new JsonCtn ( ) ;
ctn . CTNTYPE = row2 [ "EDI代码" ] . ToString ( ) ;
ctn . CTNNUM = row2 [ "数量" ] . ToString ( ) ;
ctnlist . Add ( ctn ) ;
}
}
result . CTNLIST = ctnlist ;
}
}
return result ;
}
public static DataTable QuerySql ( string connStr , string condition )
{
SqlConnection conn = new SqlConnection ( connStr ) ;
SqlDataAdapter dataAdapter = new SqlDataAdapter ( condition , conn ) ;
DataTable tQuery = new DataTable ( ) ;
dataAdapter . Fill ( tQuery ) ;
return tQuery ;
}
public static string GetMailStmp ( string connStr , string StmpID = "" )
{
var result = "" ;
var sqlQuery = " select * from Mail_Send_Smtp " ;
if ( StmpID ! = "" ) sqlQuery = sqlQuery + " WHERE GID='" + StmpID + "'" ;
DataTable tQuery = QuerySql ( connStr , sqlQuery ) ;
if ( tQuery . Rows . Count > = 0 )
{
result = tQuery . Rows [ 0 ] [ "GID" ] . ToString ( ) ;
}
return result ;
}
public static int ExecSql ( string connStr , string SqlStr )
{
SqlConnection SCON = null ; //连接对象
SqlCommand SCom = new SqlCommand ( ) ; //命令对象
SCON = new SqlConnection ( connStr ) ;
SCON . Open ( ) ;
SCom . CommandText = SqlStr ;
SCom . Connection = SCON ;
SCom . CommandType = CommandType . Text ;
int num = SCom . ExecuteNonQuery ( ) ;
SCON . Close ( ) ;
return num ;
}
public static int SaveMail ( string connStr , string sendto , string title , string body , string smtpid )
{
var sqlstr = $" INSERT INTO [Mail_Send] ([GID],[SendTo],[Title],[Body],[SendStatus],[TryCount],[CreateTime],[SmtpConfig],[Sender],[ShowName]) select newid(),'{sendto}','{title}','{body.Replace(" ' ", " ' ' ")}','Create',0,GETDATE(),'{smtpid}','','' " ;
return ExecSql ( connStr , sqlstr ) ;
}
public static string GetPosStringplus ( string str , int pos , bool isnum = false )
{
var result = "" ;
if ( isnum ) result = "0" ;
var j = 0 ;
if ( str . IndexOf ( "+" ) = = - 1 ) return result ;
str = str . Replace ( "??" , "?" ) . Replace ( "?'" , "'" ) . Replace ( "?+" , "し" ) ;
for ( int i = 1 ; i < pos ; i + + )
{
if ( str . IndexOf ( "+" ) = = - 1 ) return result ;
if ( str . IndexOf ( "+" ) ! = - 1 )
{
j = str . IndexOf ( "+" ) ;
str = str . Substring ( j + 1 , str . Length - j - 1 ) ;
}
}
j = str . IndexOf ( "+" ) ;
if ( j ! = - 1 )
{
str = str . Substring ( 0 , j ) ;
}
else
{
if ( str . Length ! = 0 )
str = str . Substring ( 0 , str . Length ) ;
}
result = str . Replace ( "し" , "+" ) ;
if ( isnum )
{
if ( result = = "" )
result = "0" ;
}
return result ;
}
public static string GetPosString ( string str , int pos , bool isnum = false )
{
var result = "" ;
if ( isnum ) result = "0" ;
var j = 0 ;
if ( str . IndexOf ( ":" ) = = - 1 ) return result ;
str = str . Replace ( "??" , "?" ) . Replace ( "?:" , "^" ) . Replace ( "?'" , "'" ) ;
for ( int i = 1 ; i < pos ; i + + )
{
if ( str . IndexOf ( ":" ) = = - 1 ) return result ;
if ( str . IndexOf ( ":" ) ! = - 1 )
{
j = str . IndexOf ( ":" ) ;
str = str . Substring ( j + 1 , str . Length - j - 1 ) ;
}
}
j = str . IndexOf ( ":" ) ;
if ( j ! = - 1 )
{
str = str . Substring ( 0 , j ) ;
}
else
{
if ( str . Length ! = 0 )
str = str . Substring ( 0 , str . Length ) ;
}
result = str . Replace ( "^" , ":" ) ;
if ( isnum )
{
if ( result = = "" )
result = "0" ;
}
return result ;
}
public class JsonCtn
{
public string CTNTYPE { get ; set ; }
public string CTNNUM { get ; set ; }
}
public class JsonOpSeae
{
public string BSNO { get ; set ; }
public string MBLNO { get ; set ; }
public string EMAIL { get ; set ; }
public string PORTDISCHARGID { get ; set ; }
public string PORTDISCHARG { get ; set ; }
public string TMPSTR { get ; set ; }
public string DESTINATIONID { get ; set ; }
public string DESTINATION { get ; set ; }
public List < JsonCtn > CTNLIST { get ; set ; }
}
}
}