151 lines
6.1 KiB
C#
151 lines
6.1 KiB
C#
using YLErp.BLL;
|
||
using YLErp.DBModels.Converts;
|
||
using YLErp.Helpers;
|
||
using YLErp.Modules;
|
||
using YLErp.Modules.TradeModule;
|
||
|
||
namespace YLErp.CustomizedBizLogic
|
||
{
|
||
public class BizLogicGDGZ : BizLogicDefault
|
||
{
|
||
/// <summary>
|
||
/// 生成客户编号
|
||
/// 生成规则:C01A开头+00001(5位序号),例:C01A00001
|
||
/// </summary>
|
||
/// <param name="initialCode">客户创建时的初始编号,如果没有传null</param>
|
||
/// <param name="db"></param>
|
||
public override void GenerateClientCode(Client clientObj, IQueryable<Client> 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;
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 在交易确认前生成交易编号
|
||
/// </summary>
|
||
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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 格式化Double
|
||
/// </summary>
|
||
/// <param name="value"></param>
|
||
/// <param name="num">小数点后位数</param>
|
||
/// <param name="ignoreZero">是否忽略小数点后的0</param>
|
||
/// <returns></returns>
|
||
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');
|
||
}
|
||
}
|
||
}
|