79 lines
3.4 KiB
C#
79 lines
3.4 KiB
C#
using YLErp.BLL;
|
|
using YLErp.Modules;
|
|
|
|
namespace YLErp.CustomizedBizLogic
|
|
{
|
|
public class BizLogicZL : BizLogicDefault
|
|
{
|
|
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("生成合同编号失败,请先确认该交易成交日期!");
|
|
}
|
|
|
|
var client = DataCacheProvider.GetClientDataSource().GetData(reqModel.clientId);
|
|
if (client == null)
|
|
{
|
|
throw new Exception("未找到客户!");
|
|
}
|
|
var code = "";
|
|
|
|
var trade = reqModel.trade;
|
|
var prefix = "";
|
|
var um = DataCacheProvider.GetUnderlyingDataSource().GetData(trade.UnderlyingCode);
|
|
|
|
if (trade.TradeType == "收益互换")
|
|
{
|
|
prefix = "SW-" + client.Number + "-" + trade.TradeDate?.ToString("yyyyMMdd") + "-" + um.UnderlyingCode + "-";
|
|
|
|
var tradeNumbers = db.trade.Where(O =>
|
|
O.TradeNumber.StartsWith(prefix)
|
|
&& O.ValidState != "InValid").Select(O => O.TradeNumber).OrderByDescending(O => O);
|
|
var tradeNumber = tradeNumbers.FirstOrDefault();
|
|
var tradeCount = 1;
|
|
if (string.IsNullOrWhiteSpace(tradeNumber) || !int.TryParse(tradeNumber.Substring(prefix.Length), out tradeCount))
|
|
{
|
|
tradeCount = 1;
|
|
}
|
|
do
|
|
{
|
|
code = $"{prefix}{tradeCount}";
|
|
tradeCount++;
|
|
} while (tradeNumbers.Contains(code));
|
|
}
|
|
else
|
|
{
|
|
//期权累交易编号包含客户编号,但是序号在同一个交易日不区分客户,也就是同一个交易日,不同客户的序号也不能相同
|
|
var dataCode = "";
|
|
var tradeDateString = trade.TradeDate?.ToString("yyyyMMdd");
|
|
prefix = client.Number + "-" + tradeDateString;
|
|
|
|
var tradeNumbers = db.trade.Where(O =>
|
|
O.TradeNumber.Contains(tradeDateString)
|
|
&& O.ValidState != "InValid").Select(O => O.TradeNumber).ToList();
|
|
var numberStrings = tradeNumbers.Where(x => x.Contains(tradeDateString)).Select(x => new { number = x.Substring(x.Length - 4), preString = x.Substring(0, x.Length - 4) }).Where(x => int.TryParse(x.number, out var num) && x.preString.Contains(tradeDateString));
|
|
var numberString = numberStrings.OrderByDescending(x => x.number).FirstOrDefault();
|
|
var number = 1;
|
|
if (string.IsNullOrWhiteSpace(numberString?.number) || !int.TryParse(numberString?.number, out number))
|
|
{
|
|
number = 1;
|
|
}
|
|
do
|
|
{
|
|
code = $"{prefix}{number.ToString().PadLeft(4, '0')}";
|
|
dataCode = $"{tradeDateString}{number.ToString().PadLeft(4, '0')}";
|
|
number++;
|
|
} while (tradeNumbers.Any(x => x.Contains(dataCode)));
|
|
}
|
|
|
|
return code;
|
|
}
|
|
}
|
|
}
|