using YLErp.BLL;
using YLErp.DBModels.Converts;
using YLErp.Helpers;
using YLErp.Modules;
using YLErp.Modules.TradeModule;
namespace YLErp.CustomizedBizLogic
{
public class BizLogicGDGZ : BizLogicDefault
{
///
/// 生成客户编号
/// 生成规则:C01A开头+00001(5位序号),例:C01A00001
///
/// 客户创建时的初始编号,如果没有传null
///
public override void GenerateClientCode(Client clientObj, IQueryable clientDbQuery)
{
var prefix = "C01A";
if (string.IsNullOrWhiteSpace(clientObj.Number))
{
lock (_clientCodeLock)
{
string result;
var index = new TradeContractBLL(0, "系统").GetRuleIndex(prefix);
if (index < 100000)
{
result = index.ToString("D5");
}
else
{
//如果大于99999,将生成C01A100000等字符串,需求是说不会大于100000的
result = index.ToString();
}
clientObj.Number = prefix + result;
}
}
}
///
/// 在交易确认前生成交易编号
///
public override string GenerateTradeNumberBeforeConfirm(TradeNumberReqModel reqModel, YLContext db)
{
if (reqModel is null)
{
throw new ArgumentNullException(nameof(reqModel));
}
var client = DataCacheProvider.GetClientDataSource().GetData(reqModel.clientId);
if (string.IsNullOrWhiteSpace(client.Abbreviation))
{
throw new Exception("生成交易编号失败,请先添加客户简称");
}
//相对行权价时,交易编号中要使用实际的行权价;
var strike = reqModel.trade.Strike ?? 0;
if (reqModel.trade.IsMoneynessOptionData) { strike *= (reqModel.trade.SpotPrice ?? 0); }
var result = "";
if (reqModel.trade.StructureType == "结构化交易" && reqModel.trade.TradeNumber == "FWD")
{
result = $"{client.Abbreviation}{DateFormat(reqModel.trade.TradeDate.Value)}{DateFormat(reqModel.trade.ExerciseDate.Value)}{reqModel.trade.UnderlyingCode}FWD";
}
else if (reqModel.trade.StructureType == "结构化交易" && reqModel.trade.TradeNumber == "SPD")
{
result = $"{client.Abbreviation}{DateFormat(reqModel.trade.TradeDate.Value)}{DateFormat(reqModel.trade.ExerciseDate.Value)}{reqModel.trade.UnderlyingCode}SPD";
}
else if (reqModel.trade.StructureType == "跨式组合")
{
result = $"{client.Abbreviation}{DateFormat(reqModel.trade.TradeDate.Value)}{DateFormat(reqModel.trade.ExerciseDate.Value)}{reqModel.trade.UnderlyingCode}STD";
}
else if (reqModel.trade.StructureType == "宽跨式组合")
{
result = $"{client.Abbreviation}{DateFormat(reqModel.trade.TradeDate.Value)}{DateFormat(reqModel.trade.ExerciseDate.Value)}{reqModel.trade.UnderlyingCode}STG";
}
else
{
result = $"{client.Abbreviation}{DateFormat(reqModel.trade.TradeDate.Value)}{DateFormat(reqModel.trade.ExerciseDate.Value)}{reqModel.trade.UnderlyingCode}{(BuySellConvert.GetClientBuySell(reqModel.trade.BuySell) == "买入" ? "B" : "S")}{(reqModel.trade.OptionType == "看涨" ? "C" : "P")}K{DoubleFormat(strike, 4)}";
}
#region 2019-08-09改为下面的逻辑
//var existCount = db.trade.Where(x => x.TradeNumber.Contains(result)).Count();
//var hasAddedCount = trades == null ? 0 : trades.Where(x => x.TradeNumber.Contains(result)).Count();
//if (existCount + hasAddedCount > 0)
//{
// result = result + Convert.ToChar('A' + (existCount + hasAddedCount));
//}
#endregion
var tradeNumbers = db.trade.Where(x => x.TradeNumber.ToUpper().StartsWith(result.ToUpper())).Select(O => O.TradeNumber).ToList();
if (tradeNumbers.Where(x => x.ToUpper().Contains(result.ToUpper())).Any())
{
var tempNumber = "";
var index = 1;
do
{
tempNumber = result;
tempNumber += DataHelper.ConvertToLetter(index++);
} while (tradeNumbers.Where(x => x.ToUpper().Contains(tempNumber.ToUpper())).Any());
result = tempNumber;
}
return result;
}
private string DateFormat(DateTime date)
{
var month = date.Month.ToString();
if (date.Month == 10)
{
month = "A";
}
else if (date.Month == 11)
{
month = "B";
}
else if (date.Month == 12)
{
month = "C";
}
var day = date.Day.ToString().PadLeft(2, '0');
return month + day;
}
///
/// 格式化Double
///
///
/// 小数点后位数
/// 是否忽略小数点后的0
///
private string DoubleFormat(double? value, int num = 1, bool ignoreZero = true)
{
if (value == null)
{
return "0";
}
if (Math.Floor(value.Value) == value)
{
return ((int)value).ToString();
}
var fromatStr = "0";
if (num > 0) { fromatStr += ".".PadRight(num + 1, ignoreZero ? '#' : '0'); }
return value.Value.ToString(fromatStr).Replace('.', 'D');
}
}
}