Files
zszq-trs/YLErpDAL/CustomizedBizLogic/BizLogicXiangYu.cs
T
2024-05-09 14:06:26 +08:00

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;
}
}
}