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 { /// /// 交易确认书接口 /// 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')}"; } /// /// 获取确认书 /// 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; } /// /// 获取确认书 /// public IEnumerable 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; ; } /// /// 获取所有文档 /// public IEnumerable 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; } /// /// 删除确认书 /// public void DeleteConfirmBook(int tradeId, string contractType = ContractTypeEnum.Trade) { new TradeDocumentDataService(this).DeleteConfirmBook(tradeId, contractType); } /// /// 获取对应的交易确认书协议版本号 /// 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; } } /// /// 检查相同合约书号是否对应的相同客户相同交易方向的确认书编号(买卖方向) /// 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 GetContractDocDic(List swapFlowEventIds, string contractType, DateTime valueDate) { Dictionary dic=new Dictionary(); 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> ContractTrades = null; } }