using YLErp.BLL; using YLErp.Modules; namespace YLErp.CustomizedBizLogic { public class BizLogicXiangYu : BizLogicDefault { //编号规则:080501(客户编号)+220311(年月日)+C/P/E/F(C-香草看涨,P-香草看跌,E-剩余的其他期权类型,F-远期)+0001(默认成交笔数) public override string GenerateTradeNumberBeforeConfirm(TradeNumberReqModel reqModel, YLContext db) { if (reqModel is null) { throw new ArgumentNullException(nameof(reqModel)); } if (reqModel.trade.TradeDate == null) { throw new Exception("生成合同编号失败,请先确认该交易成交日期!"); } if (!string.IsNullOrWhiteSpace(reqModel.trade.TradeNumber)) { return reqModel.trade.TradeNumber; } string code = ""; var client = DbContextFactory.GetClientDbContext(null).client.Where(a => a.id == reqModel.clientId).FirstOrDefault(); if (client == null) { throw new Exception("未找到客户!"); } string clientNumber = client.Number; string tradeDate = reqModel.trade.TradeDate?.ToString("yyMMdd"); string type = string.Empty; switch (reqModel.trade.TradeType) { case "香草期权": type = reqModel.trade.OptionType == "看涨" ? "C" : "P"; break; case "远期": type = "F"; break; case "累计期权": var otype= reqModel.trade.OptionType == "看涨" ? "C" : "P"; var payoffType = reqModel.trade.trade_accumulator_option.PayoffType=="浮动"?"A":"F"; return GetAccumulatorCode(db, payoffType+ otype, reqModel.trade.TradeDate, client.id,reqModel.trade.UnderlyingCode,reqModel.importTrades); default: type = "E"; break; } code = $"{clientNumber}{tradeDate}{type}"; var tradeNumbers = new List(); tradeNumbers = db.trade.Where(x => x.TradeNumber.StartsWith(code) && x.ParentTradeId == 0).Select(x => x.TradeNumber).ToList(); //获取导入 if (reqModel.importTrades != null) { tradeNumbers.AddRange(reqModel.importTrades.Select(O => O.TradeNumber)); } var number = tradeNumbers.Count; var returnCode = string.Empty; do { number++; returnCode = $"{code}{number:0000}"; if (!tradeNumbers.Contains(returnCode)) { break; } } while (true); return returnCode; } /// /// 累计期权交易编号 /// /// /// /// /// /// /// /// private string GetAccumulatorCode(YLContext db,string type,DateTime? tradeDate,int clientId,string underlyingCode, List importTrades) { var code = ""; var tradeNumbers = new List(); var query = db.trade.Where(x => x.ParentTradeId == 0 && x.TradeType == "累计期权" && x.UnderlyingCode == underlyingCode && x.ValidState != "InValid"); var tradeQuery = query.Where(x => x.TradeDate == tradeDate); tradeNumbers = query.Select(x => x.TradeNumber).ToList(); int clientCount = query.Where(x => x.ClientId == clientId).Count(); //获取导入 if (importTrades != null) { tradeNumbers.AddRange(importTrades.Select(O => O.TradeNumber)); clientCount += importTrades.Where(x => x.ClientId == clientId).Count(); } var number = tradeQuery.Count(); do { number++; clientCount++; code = $"{underlyingCode}-{number}-{tradeDate:yyMMdd}{type}{clientCount}"; if (!tradeNumbers.Contains(code)) { break; } } while (true); return code; } } }