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.
DS7/JobAutoCreateFee/JobDjyFee.cs

447 lines
19 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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 编号='" + 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; }
}
}