You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

447 lines
20 KiB
C#

10 months ago
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 JobDjyFee : IJob
{
private ILog log = LogManager.GetLogger(typeof(JobDjyFee));
public void Execute(IJobExecutionContext context)
{
log.Debug($"Execute开始");
try
{
string connStr = context.JobDetail.JobDataMap.GetString("ConnectString");
string reqUrl = context.JobDetail.JobDataMap.GetString("DjyReqFeeUrl");
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);
Dictionary<string, string> dicData = new Dictionary<string, string>();
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<List<JsonFeeResponse>>(rtn);
if (parseJsonObj != null && parseJsonObj.Count > 0)
{
var returnlist = parseJsonObj;
var feebacklist = new List<feeback>();
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 != "提交财务" && BS.FEESTATUS != "费用封帐" && BS.BSSTATUS != "应付完毕")
{
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(" MSK发票号码='" + returndata.CANCEL_NO + "' and DE_ID='大简云帐单'", dbcon);
foreach (var fee in feelist)
{
sql = "DELETE FROM t_ch_fee where CH_ID=" + 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 [t_ch_fee] ([类型],[费用状态],[编号],[费用名称],[结算单位],[客户名称],[标准]";
sql = sql + ",[单价],[数量],[金额],[币别],[汇率],[备注],[结算金额],[开票金额]";
sql = sql + ",[录入人],[录入日期],[是否对帐],[顺序],[冲抵金额]";
sql = sql + ",[机密],[是否垫付],[申请金额],[不开发票],[费用英文名称]";
sql = sql + ",[申请开票],[提交],[不含税价],[税率],[税额],MSK发票号码,DE_ID) VALUES ";
sql = sql + "('付','录入状态','" + BS.BSNO + "','" + FEENAME.Replace(",", "").Replace("'", "''") + "','船公司','CMA','" + GETUNIT(feedata.UNIT.Replace(",", ""), feedata.CTNALL.Replace(",", "")) + "'";
sql = sql + "," + price + "," + COUNT.Replace(",", "") + "," + AMOUNT.Replace(",", "") + ",'" + curr + "'," + exrate.ToString() + ",'',0,0";
sql = sql + ",'SA',GETDATE(),0,10,0";
sql = sql + ",0,0,0,0,'" + feedata.FEECODE.Replace(",", "").Replace(".", "") + "'";
sql = sql + ",0,0," + price + ",0,0,'" + returndata.INVOICE_NO + "','大简云帐单')";
// 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);
}
}
}
}
else {
var feeback = new feeback();
feeback.ReceiveId = returndata.ReceiveId;
feeback.Success = false;
if (BS.BSSTATUS == "应付完毕")
feeback.Reason = "业务状态为:" + BS.BSSTATUS + " 不允许插入费用!";
else
feeback.Reason = "费用状态为:" + BS.FEESTATUS + " 不允许插入费用!";
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 OPSEAE GETBSNO(string MBLNO, SqlConnection dbcon)
{
var OPSEAE = new OPSEAE();
var strSql = new StringBuilder();
strSql.Append("SELECT 编号,费用状态,业务状态 from t_op_seae where 主提单号='" + 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["编号"].ToString();
OPSEAE.FEESTATUS = row["费用状态"].ToString();
OPSEAE.BSSTATUS = row["业务状态"].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 t_ch_fee where 费用状态<>'录入状态' AND 类型='付' and 结算单位='船公司' and (费用名称<>'提箱小票费' and 费用名称<>'EDI信息服务费') 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 t_ch_fee where 编号='" + BSNO + "' AND MSK发票号码='" + 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 t_ch_fee where MSK发票号码='" + INVNO + "' and DE_ID='大简云帐单' ");
strSql.Append(" AND (ISNULL(结算金额,0)<>0 OR ISNULL(开票金额,0)<>0 OR ISNULL(冲抵金额,0)<>0 OR ISNULL(申请金额,0)<>0 OR ISNULL(申请开票,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 [费用名称] from t_code_fee_mskedi where [费用英文名称]='" + 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["费用名称"].ToString();
}
}
if (string.IsNullOrEmpty(FEENAME))
{
//if (curr == "USD")
//{
// FEENAME = "海运费";
//} else
FEENAME = FEECODE;
}
return FEENAME;
}
static public List<jffee> GetFeeList(string constr, SqlConnection dbcon) {
var feelist = new List<jffee>();
var strSql = new StringBuilder();
strSql.Append("select CH_ID,编号 from t_ch_fee where " + constr);
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)
{
var fee = new jffee();
fee.ch_id = row["CH_ID"].ToString();
fee.bsno = row["编号"].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 汇率 from t_code_usdexrate where 开始日期<=GETDATE() and 结束日期>=GETDATE()");
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["汇率"].ToString());
}
}
}
if (usdexrate == 0)
{
SqlDataAdapter adapter2 = new SqlDataAdapter("select 汇率 from t_code_currency where 币别='"+ curr + "'", dbcon);
DataTable table2 = new DataTable();
adapter2.Fill(table2);
if (table2.Rows.Count > 0)
{
foreach (DataRow row in table2.Rows)
{
usdexrate = Convert.ToDecimal(row["汇率"].ToString());
}
}
}
return usdexrate;
}
}
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<DJYFEE> 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 OPSEAE
{
public string BSNO { get; set; }
public string FEESTATUS { get; set; }
public string 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; }
}
}