104 lines
4.4 KiB
C#
104 lines
4.4 KiB
C#
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<string>();
|
|
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;
|
|
}
|
|
/// <summary>
|
|
/// 累计期权交易编号
|
|
/// </summary>
|
|
/// <param name="db"></param>
|
|
/// <param name="type"></param>
|
|
/// <param name="tradeDate"></param>
|
|
/// <param name="clientId"></param>
|
|
/// <param name="underlyingCode"></param>
|
|
/// <param name="importTrades"></param>
|
|
/// <returns></returns>
|
|
private string GetAccumulatorCode(YLContext db,string type,DateTime? tradeDate,int clientId,string underlyingCode, List<trade> importTrades)
|
|
{
|
|
var code = "";
|
|
var tradeNumbers = new List<string>();
|
|
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;
|
|
}
|
|
}
|
|
}
|