using log4net; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Quartz; using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.IO; using System.Linq; using System.Text; namespace JobCreateFee { public class JobD7DjyFee : IJob { private ILog log = LogManager.GetLogger(typeof(JobD7DjyFee)); public void Execute(IJobExecutionContext context) { log.Debug($"Execute开始"); try { string connStr = context.JobDetail.JobDataMap.GetString("ConnectString"); string reqUrl = context.JobDetail.JobDataMap.GetString("DjyReqFeeUrl"); string ENTEROPERATOR = context.JobDetail.JobDataMap.GetString("ENTEROPERATOR"); string companyCode = context.JobDetail.JobDataMap.GetString("DjyFeeCompanyCode"); string returnUrl = context.JobDetail.JobDataMap.GetString("DjyReturnFeeUrl"); int reqTimeout = Convert.ToInt32(context.JobDetail.JobDataMap.GetString("RequestTimeout")); long ts = DataTableToJsonHelper.ConvertDateTimeToInt(DateTime.Now); string KFCUSTCODE = context.JobDetail.JobDataMap.GetString("KFCUSTCODE"); string KFCUSTKEY = context.JobDetail.JobDataMap.GetString("KFCUSTKEY"); string KFUSERID = context.JobDetail.JobDataMap.GetString("KFUSERID"); string KFURL = context.JobDetail.JobDataMap.GetString("KFURL"); Dictionary dicData = new Dictionary(); dicData.Add("compid", companyCode); log.Debug($"获取数据"); //发送请求数据 string rtn = WebRequestHelper.DoPost(reqUrl, dicData, reqTimeout * 1000); //var objRtn = JsonConvert.DeserializeAnonymousType(rtn, new { status = "", message = "" }); log.Debug($"数据返回:{rtn}"); var parseJsonObj = JsonConvert.DeserializeObject>(rtn); if (parseJsonObj != null && parseJsonObj.Count > 0) { var returnlist = parseJsonObj; var feebacklist = new List(); string sql = ""; try { using (SqlConnection dbcon = new SqlConnection(connStr)) { dbcon.Open(); foreach (var returndata in returnlist) { var BS = GETBSNO(returndata.MBLNO, dbcon); if (BS.BSNO != "" && !BS.FEESTATUS) { //if (GETCARRIERFEEUSD(BS.BSNO, dbcon)) //{ // var feeback = new feeback(); // feeback.ReceiveId = returndata.ReceiveId; // feeback.Success = false; // feeback.Reason = "船公司费用已提交"; // feebacklist.Add(feeback); //} //else //{ if (!string.IsNullOrEmpty(returndata.CANCEL_NO)) { if (GETFEEISUSE(returndata.CANCEL_NO, dbcon)) { var feeback = new feeback(); feeback.ReceiveId = returndata.ReceiveId; feeback.Success = false; feeback.Reason = "费用已结算或申请"; feebacklist.Add(feeback); } else { var feelist = GetFeeList(" DELIVERYNO='" + returndata.CANCEL_NO + "'", dbcon); foreach (var fee in feelist) { sql = "DELETE FROM ch_fee where GID=" + fee.ch_id; SqlCommand cmd = new SqlCommand(sql, dbcon); cmd.ExecuteNonQuery(); } var feeback = new feeback(); feeback.ReceiveId = returndata.ReceiveId; feeback.Success = true; feeback.Reason = ""; feebacklist.Add(feeback); } } else { if (!GETINVNOISUSE(BS.BSNO, returndata.INVOICE_NO, dbcon)) { var FeeList = returndata.DATA; foreach (var feedata in FeeList) { if (Convert.ToDecimal(feedata.AMOUNT.Trim()) > 0) { var price = feedata.RATE; if (price == "") price = "0"; var curr = feedata.CURRENCY; if (curr == "CNY") curr = "RMB"; var FEENAME = GETFEENAME(feedata.FEECODE.Replace("'", "").Replace(",", "").Replace(".", ""), dbcon, curr); decimal exrate = 1; var AMOUNT = feedata.AMOUNT; var COUNT = feedata.COUNT; if (curr != "RMB") { if (curr != "USD") { if (!string.IsNullOrEmpty(feedata.AMOUNT_USD) && feedata.AMOUNT_USD != "0") { AMOUNT = feedata.AMOUNT_USD; curr = "USD"; COUNT = "1"; price = AMOUNT; } } exrate = GetUsdExrate(dbcon, curr); } price = price.Replace(",", ""); sql = "INSERT INTO ch_fee(GID, BSNO, FEETYPE, FEENAME,CUSTOMERTYPE, CUSTOMERNAME, UNIT, UNITPRICE, QUANTITY, AMOUNT, CURRENCY,"; sql = sql + "EXCHANGERATE, REASON, REMARK, COMMISSIONRATE,ENTEROPERATOR, ENTERDATE,ISOPEN, ISADVANCEDPAY, SORT, FEESTATUS, FEEFRT,CARGO_GID,"; sql = sql + "TAXRATE,NOTAXAMOUNT,ACCTAXRATE,LINENUM,TAXUNITPRICE,MODIFIEDUSER,MODIFIEDTIME,WMSOUTBSNO,PREAMOUNT,ISINVOICE,INPUTMODE,LOCALCURR,MANAGER,ISACC,FEEDESCRIPTION,DELIVERYNO,SETTLEMENT,INVOICE,ORDERAMOUNT,ORDERINVOICE,ORDERSETTLEMENT,ORDERINVSETTLEMENT)"; sql = sql + "VALUES "; sql = sql + "('"+ Guid.NewGuid().ToString()+ "','" + BS.BSNO + "',2,'" + FEENAME.Replace(",", "") + "','船公司','CMA','" + GETUNIT(feedata.UNIT.Replace(",", ""), feedata.CTNALL.Replace(",", "")) + "'"; sql = sql + "," + price + "," + COUNT.Replace(",", "") + "," + AMOUNT.Replace(",", "") + ",'" + curr + "'," + exrate.ToString() + ",'','',0"; sql = sql + ",'"+ ENTEROPERATOR + "',GETDATE(),0,0,10,1,'',''"; sql = sql + ",0,"+ AMOUNT.Replace(",", "") + ",0,0," + price + ","+ ENTEROPERATOR + ",GETDATE(),'',0,0,'','RMB','',0,'" + feedata.FEECODE.Replace(",", "").Replace(".", "") + "'"; sql = sql + ",'" + returndata.INVOICE_NO + "',0,0,0,0,0,0)"; // log.Debug($"更新语句:{sql}"); SqlCommand cmd = new SqlCommand(sql, dbcon); cmd.ExecuteNonQuery(); } } var feeback = new feeback(); feeback.ReceiveId = returndata.ReceiveId; feeback.Success = true; feeback.Reason = ""; feebacklist.Add(feeback); string guid = Guid.NewGuid().ToString(); DeductionFee(guid, returndata.MBLNO,KFCUSTCODE,KFCUSTKEY,KFUSERID,KFURL); } } //} } else { var feeback = new feeback(); feeback.ReceiveId = returndata.ReceiveId; feeback.Success = false; feeback.Reason = "费用状态已锁定 不允许插入费用!"; feebacklist.Add(feeback); log.Debug($"提单号:{returndata.MBLNO},编号:{BS.BSNO},费用状态:{BS.FEESTATUS} 未插入"); } } dbcon.Close(); } if (feebacklist.Count != 0) { log.Debug($"上传数据:{JsonConvert.SerializeObject(feebacklist.ToList())}"); string rtn2 = WebRequestHelper.DoPost(returnUrl, JsonConvert.SerializeObject(feebacklist.ToList()), reqTimeout * 1000); log.Debug($"数据返回2:{rtn2}"); } } catch (Exception e) { log.Debug($"记录插入错误:{e.Message}" + sql); } } else { log.Debug($"数据返回错误:{parseJsonObj}"); } } catch (Exception ex) { log.Error(ex.Message); log.Error(ex.StackTrace); } } static public D7OPSEAE GETBSNO(string MBLNO, SqlConnection dbcon) { var OPSEAE = new D7OPSEAE(); var strSql = new StringBuilder(); strSql.Append("SELECT BSNO,BSSTATUS,FEESTATUS from op_seae where MBLNO='" + MBLNO + "'"); SqlDataAdapter adapter = new SqlDataAdapter(strSql.ToString(), dbcon); DataTable table = new DataTable(); adapter.Fill(table); var BSNO = ""; if (table.Rows.Count > 0) { foreach (DataRow row in table.Rows) { OPSEAE.BSNO = row["BSNO"].ToString(); OPSEAE.FEESTATUS = Convert.ToBoolean(row["FEESTATUS"].ToString()); OPSEAE.BSSTATUS = Convert.ToBoolean(row["BSSTATUS"].ToString()); } } return OPSEAE; } //static public bool GETCARRIERFEEUSD(string BSNO, SqlConnection dbcon) //{ // var result = false; // var strSql = new StringBuilder(); // strSql.Append("SELECT COUNT(1) CT from ch_fee where 费用状态<>'录入状态' AND 类型='付' and 结算单位='船公司' and 费用名称<>'提箱小票费' and 编号='" + BSNO + "'"); // SqlDataAdapter adapter = new SqlDataAdapter(strSql.ToString(), dbcon); // DataTable table = new DataTable(); // adapter.Fill(table); // if (table.Rows.Count > 0) // { // foreach (DataRow row in table.Rows) // { // if (Convert.ToInt32(row["CT"].ToString())!=0) // result = true; // } // } // return result; //} static public bool GETINVNOISUSE(string BSNO,string INVNO, SqlConnection dbcon) { var result = false; var strSql = new StringBuilder(); strSql.Append("SELECT COUNT(1) CT from ch_fee where BSNO='" + BSNO + "' AND DELIVERYNO='" + INVNO + "'"); SqlDataAdapter adapter = new SqlDataAdapter(strSql.ToString(), dbcon); DataTable table = new DataTable(); adapter.Fill(table); if (table.Rows.Count > 0) { foreach (DataRow row in table.Rows) { if (Convert.ToInt32(row["CT"].ToString()) != 0) result = true; } } return result; } static public bool GETFEEISUSE(string INVNO, SqlConnection dbcon) { var result =false; var strSql = new StringBuilder(); strSql.Append("SELECT COUNT(1) CT from ch_fee where DELIVERYNO='" + INVNO + "' "); strSql.Append(" AND (ISNULL(SETTLEMENT,0)<>0 OR ISNULL(INVOICE,0)<>0 OR ISNULL(ORDERAMOUNT,0)<>0 OR ISNULL(ORDERINVOICE,0)<>0 ) "); SqlDataAdapter adapter = new SqlDataAdapter(strSql.ToString(), dbcon); DataTable table = new DataTable(); adapter.Fill(table); if (table.Rows.Count > 0) { foreach (DataRow row in table.Rows) { result = Convert.ToInt16(row["CT"].ToString())>0; } } return result; } static public string GETUNIT(string UNIT,string CTNALL) { var BSNO = UNIT; if (BSNO == "FIX") BSNO = "单票"; if (BSNO == "UNI") BSNO = CTNALL; return BSNO.Replace("'", "''"); } static public string GETFEENAME(string FEECODE, SqlConnection dbcon, string curr) { var strSql = new StringBuilder(); strSql.Append("select top 1 [FEENAME] from code_fee_edi where [FEEENAME]='" + FEECODE + "'"); SqlDataAdapter adapter = new SqlDataAdapter(strSql.ToString(), dbcon); DataTable table = new DataTable(); adapter.Fill(table); var FEENAME = ""; if (table.Rows.Count > 0) { foreach (DataRow row in table.Rows) { FEENAME = row["FEENAME"].ToString(); } } if (string.IsNullOrEmpty(FEENAME)) { //if (curr == "USD") //{ // FEENAME = "海运费"; //} else FEENAME = FEECODE; } return FEENAME; } static public string GETCUSTNAME(string CUSTCODE, SqlConnection dbcon, string curr) { var strSql = new StringBuilder(); strSql.Append("select top 1 [CUST] from code_cust_edi where [EDICODE]='" + CUSTCODE + "'"); SqlDataAdapter adapter = new SqlDataAdapter(strSql.ToString(), dbcon); DataTable table = new DataTable(); adapter.Fill(table); var FEENAME = ""; if (table.Rows.Count > 0) { foreach (DataRow row in table.Rows) { FEENAME = row["CUST"].ToString(); } } if (string.IsNullOrEmpty(FEENAME)) { //if (curr == "USD") //{ // FEENAME = "海运费"; //} else FEENAME = CUSTCODE; } return FEENAME; } static public List GetFeeList(string constr, SqlConnection dbcon) { var feelist = new List(); var strSql = new StringBuilder(); strSql.Append("select GID,BSNO from ch_fee where " + constr); SqlDataAdapter adapter = new SqlDataAdapter(strSql.ToString(), dbcon); DataTable table = new DataTable(); adapter.Fill(table); if (table.Rows.Count > 0) { foreach (DataRow row in table.Rows) { var fee = new jffee(); fee.ch_id = row["GID"].ToString(); fee.bsno = row["BSNO"].ToString(); feelist.Add(fee); } } return feelist; } static public decimal GetUsdExrate(SqlConnection dbcon,string curr) { decimal usdexrate = 0; if (curr == "USD") { var strSql = new StringBuilder(); strSql.Append("select VALUE from currency_exchange where STARTTIME<=GETDATE() and ENDTIME>=GETDATE()"); strSql.Append(" and CURRENCYID in (select GID from code_currency where CODENAME='"+curr+"') "); SqlDataAdapter adapter = new SqlDataAdapter(strSql.ToString(), dbcon); DataTable table = new DataTable(); adapter.Fill(table); if (table.Rows.Count > 0) { foreach (DataRow row in table.Rows) { usdexrate = Convert.ToDecimal(row["VALUE"].ToString()); } } } if (usdexrate == 0) { SqlDataAdapter adapter2 = new SqlDataAdapter("select DEFAULTRATE from code_currency where CODENAME='" + curr + "'", dbcon); DataTable table2 = new DataTable(); adapter2.Fill(table2); if (table2.Rows.Count > 0) { foreach (DataRow row in table2.Rows) { usdexrate = Convert.ToDecimal(row["DEFAULTRATE"].ToString()); } } } return usdexrate; } public bool DeductionFee(string _Guid, string _MBLNO, string custname, string custkey, string userid, string djyurl, string bsType = "7") { var seconds = DateTime.Now.ToTimeStamp(); var runId = Guid.NewGuid().ToString(); var srcBeforMD5 = $"{runId}{custname}expend{bsType}0{_Guid}{_MBLNO}{seconds}{custkey}"; //调用扣费接口 var postObj = new { runId, userId = custname, module = "expend",//固定 bsType = bsType, sendType = "0", timestamp = seconds,//秒级时间戳 md5 = srcBeforMD5.ToMd5(),// 加密字符串小写 RunId + UserId + Module + BsType + SendType+Timestamp+ Key Data = new { BSNO = _Guid, MBLNO = _MBLNO, CtnrInfo = "", CtnrCount = 1, IsCredit = 1,//是否是信用支付 1 信用支付 0不允许信用支付默认值为0 LURURENID = userid,///当前登录人id SENDUSERID = userid } }; var apiJson = JsonConvert.SerializeObject(postObj); var apiRtn = WebRequestHelper.DoPost(djyurl, apiJson); var jobjApiRtn = JObject.Parse(apiRtn); var code = Convert.ToInt32(jobjApiRtn.GetValue("code").ToString()); if (code == 200 || code == 450) { return true; } else { log.Debug($"扣费失败提醒,执行扣费失败!"); } return false; } } //public class JsonFeeResponse //{ // public string ReceiveId { get; set; } // public string MBLNO { get; set; } // public string INVOICE_NO { get; set; } // public string CANCEL_NO { get; set; } // public string TOTAL_AMOUNT { get; set; } // public List DATA { get; set; } //} //public class DJYFEE //{ // public string FEECODE { get; set; } // public string AMOUNT { get; set; } // public string AMOUNT_USD { get; set; } // public string CURRENCY { get; set; } // public string CTNALL { get; set; } // public string TAX { get; set; } // public string COUNT { get; set; } // public string UNIT { get; set; } // public string RATE { get; set; } //} public class D7OPSEAE { public string BSNO { get; set; } public bool FEESTATUS { get; set; } public bool BSSTATUS { get; set; } } //public class feeback //{ // public string ReceiveId { get; set; } // public bool Success { get; set; } // public string Reason { get; set; } //} //public class jffee //{ // public string ch_id { get; set; } // public string bsno { get; set; } //} }