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

151 lines
6.1 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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开头+000015位序号),例: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');
}
}
}