Files
2024-05-09 14:06:26 +08:00

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