Files
zszq-trs/YLErpDAL/Modules/TradeModule/TradeContractBLL.cs
T
2024-05-09 14:06:26 +08:00

275 lines
12 KiB
C#

using Org.BouncyCastle.Ocsp;
using System.Linq;
using YLErp.Abstract;
using YLErp.Commons;
using YLErp.DBModels.Abstract;
using YLErp.DBModels.Consts;
using YLErp.Model;
using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
namespace YLErp.Modules.TradeModule
{
/// <summary>
/// 交易确认书接口
/// </summary>
public class TradeContractBLL : YLBaseService, IContractBLL
{
private static readonly object lockObj = new object();
public TradeContractBLL(YLBaseService baseService) : base(baseService)
{
}
public TradeContractBLL(int optId, string optName) : base(new OptUserInfo(optId, optName, OptUserFrom.System, null))
{
}
public TradeContractBLL(OptUserInfo userInfo) : base(userInfo)
{
}
public int GetRuleIndex(string ruleId, int beginIndex = 1)
{
lock (lockObj)
{
var contractNoGenRule = DbContext.rpt_contract_no_gen_rule.FirstOrDefault(s => s.RuleId == ruleId);
if (contractNoGenRule == null)
{
contractNoGenRule = new rpt_contract_no_gen_rule
{
RuleId = ruleId,
SeqNum = beginIndex
};
DbContext.rpt_contract_no_gen_rule.Add(contractNoGenRule);
DbContext.SaveChanges();
return beginIndex;
}
contractNoGenRule.SeqNum = contractNoGenRule.SeqNum + 1;
DbContext.SaveChanges();
return contractNoGenRule.SeqNum.Value;
}
}
public string GetContractNo(string ruleId)
{
var index = GetRuleIndex(ruleId);
return $"{index.ToString().PadLeft(4, '0')}";
}
/// <summary>
/// 获取确认书
/// </summary>
public ITradeContractDocument GetContractDoc(int tradeId, string contractType, int tradeCashId = 0, DateTime? valueDate = null)
{
//var docQuery = (from contractDoc in DbContext.trade_contract_document
// from contractRelation in DbContext.trade_contract_r
// where contractDoc.Code == contractRelation.ContractCode
// && contractDoc.Type == contractRelation.Type && contractRelation.IsValid
// && contractDoc.Type == contractType && contractRelation.TradeId == tradeId
// select contractDoc);
var docQuery = DbContext.trade_contract_document
.Join(DbContext.trade_contract_r,
contractDoc => new { Code = contractDoc.Code, Type = contractDoc.Type },
contractRelation => new { Code = contractRelation.ContractCode, Type = contractRelation.Type },
(contractDoc, contractRelation) => new
{
contractDoc,
contractRelation
})
.Where(t => t.contractRelation.IsValid && t.contractDoc.Type == contractType && t.contractRelation.TradeId == tradeId);
if ((tradeCashId == 0 && contractType == ContractTypeEnum.UnWind) || contractType == ContractTypeEnum.Trade || contractType == ContractTypeEnum.Clearing)
{
var doc = docQuery.Select(d => d.contractDoc).FirstOrDefault();
return doc;
}
if (tradeCashId > 0 && contractType == ContractTypeEnum.UnWind)
{
var doc = docQuery.Where(d => d.contractRelation.TradeCashId == tradeCashId).Select(d => d.contractDoc).FirstOrDefault();
//var doc = (from contractDoc in DbContext.trade_contract_document
// from contractRelation in DbContext.trade_contract_r
// where contractDoc.Code == contractRelation.ContractCode
// && contractDoc.Type == contractRelation.Type
// && contractDoc.Type == contractType
// && contractRelation.TradeId == tradeId
// && contractRelation.TradeCashId == tradeCashId
// && contractRelation.IsValid
// select contractDoc).FirstOrDefault();
return doc;
}
if (contractType == ContractTypeEnum.Margin && valueDate != null)
{
var doc = docQuery.Where(d => d.contractDoc.ValueDate == valueDate).Select(d => d.contractDoc).FirstOrDefault();
//var doc = (from contractDoc in DbContext.trade_contract_document
// from contractRelation in DbContext.trade_contract_r
// where contractDoc.Code == contractRelation.ContractCode
// && contractDoc.Type == contractRelation.Type
// && contractDoc.Type == contractType
// && contractRelation.TradeId == tradeId
// && contractRelation.IsValid
// && contractDoc.ValueDate == valueDate
// select contractDoc).FirstOrDefault();
return doc;
}
return null;
}
public ITradeContractDocument GetContractDocBySwapEventId(int tradeId, string contractType, long swapEventId)
{
var docQuery = DbContext.trade_contract_document
.Join(DbContext.trade_contract_r,
contractDoc => new { Code = contractDoc.Code, Type = contractDoc.Type },
contractRelation => new { Code = contractRelation.ContractCode, Type = contractRelation.Type },
(contractDoc, contractRelation) => new
{
contractDoc,
contractRelation
})
.Where(t => t.contractRelation.IsValid && t.contractDoc.Type == contractType && t.contractRelation.TradeId == tradeId&&t.contractRelation.SwapFlowEventId== swapEventId);
var doc = docQuery.Select(d => d.contractDoc).FirstOrDefault();
return doc;
}
/// <summary>
/// 获取确认书
/// </summary>
public IEnumerable<ITradeContractDocument> GetContractDoc(int clientId, string contractType, DateTime valueDate)
{
var doc = (from contractDoc in DbContext.trade_contract_document
join contractRelation in DbContext.trade_contract_r
on contractDoc.Code equals contractRelation.ContractCode
join t in DbContext.trade on contractRelation.TradeId equals t.id
where
contractDoc.ValueDate == valueDate &&
contractDoc.Type == contractType &&
contractDoc.Type == contractRelation.Type &&
t.ClientId == clientId && contractRelation.IsValid
select contractDoc).ToArray();
return doc; ;
}
/// <summary>
/// 获取所有文档
/// </summary>
public IEnumerable<ITradeContractDocument> GetAllContractDocs(int tradeId)
{
var docList = (from contractDoc in DbContext.trade_contract_document
join contractRelation in DbContext.trade_contract_r on contractDoc.Code equals contractRelation.ContractCode
where contractDoc.Type == contractRelation.Type
&& contractRelation.TradeId == tradeId
&& contractRelation.IsValid
select contractDoc).ToList();
return docList;
}
/// <summary>
/// 删除确认书
/// </summary>
public void DeleteConfirmBook(int tradeId, string contractType = ContractTypeEnum.Trade)
{
new TradeDocumentDataService(this).DeleteConfirmBook(tradeId, contractType);
}
/// <summary>
/// 获取对应的交易确认书协议版本号
/// </summary>
public static string GetTradeConfirmContractVersion(ServiceRepresentativeConfig sp, string BuySell, string UnderlyingInstrumentType)
{
if (sp != null)
{
switch (BuySell)
{
case EnumTradeBuySell.Sell:
if ("Stock".Equals(UnderlyingInstrumentType))
{
return sp.StockBuyContractVersion;
}
else
{
return sp.FutureBuyContractVersion;
}
case EnumTradeBuySell.Buy:
if ("Stock".Equals(UnderlyingInstrumentType))
{
return sp.StockSellContractVersion;
}
else
{
return sp.FutureSellContractVersion;
}
default:
return null;
}
}
else
{
return null;
}
}
/// <summary>
/// 检查相同合约书号是否对应的相同客户相同交易方向的确认书编号(买卖方向)
/// </summary>
public bool HasRepeatContractCodeForDiffClient(string ContractCode, string clientName, string BuySell, out string TradeNumber)
{
TradeNumber = null;
if (ContractTrades == null)
{
ContractTrades = (from contract in DbContext.trade_contract_r
where contract.ContractCode == ContractCode
join trade in DbContext.trade on contract.TradeId equals trade.id
where trade.ValidState != "InValid" && contract.IsValid
select new { contract, trade }).ToLookup(t => t.contract.ContractCode).ToDictionary(t => t.Key, t => t.Select(a => a.trade).ToList());
}
if (ContractTrades.ContainsKey(ContractCode))
{
var query = ContractTrades[ContractCode].Where(t => t.ClientName != clientName);
if (BuySell != null)
{
query = ContractTrades[ContractCode].Where(t => t.ClientName != clientName || t.BuySell != BuySell);
}
if (query.Any())
{
TradeNumber = query.Select(t => t.TradeNumber).FirstOrDefault().ToString();
return true;
}
}
return false;
}
public trade_contract_r GetTrade_Contract_R(int tradeId)
{
return DbContext.trade_contract_r.AsNoTracking().FirstOrDefault(x => x.TradeId == tradeId && x.Type == ContractTypeEnum.Trade && x.IsValid);
}
public Dictionary<long, ITradeContractDocument> GetContractDocDic(List<long> swapFlowEventIds, string contractType, DateTime valueDate)
{
Dictionary<long, ITradeContractDocument> dic=new Dictionary<long, ITradeContractDocument>();
var contracts= DbContext.trade_contract_r.Where(x=> swapFlowEventIds.Contains(x.SwapFlowEventId??0)&&x.IsValid&&x.Type== contractType).ToList();
var ContractCodes= contracts.Select(x => x.ContractCode).ToList();
var contractDocs = DbContext.trade_contract_document.Where(x=> ContractCodes.Contains(x.Code)&&x.Type== contractType&& x.ValueDate== valueDate).ToList();
foreach (var fid in swapFlowEventIds)
{
var contract = contracts.FirstOrDefault(x=>x.SwapFlowEventId==fid);
if (contract!=null)
{
var contractDoc = contractDocs.FirstOrDefault(x=>x.Code== contract.ContractCode);
dic.Add(fid, contractDoc);
}
else
{
dic.Add(fid,null);
}
}
return dic;
}
private Dictionary<string, List<trade>> ContractTrades = null;
}
}