117 lines
5.6 KiB
C#
117 lines
5.6 KiB
C#
using YLErp.BLL;
|
||
using YLErp.Modules;
|
||
using static YLErp.ConsGlobal;
|
||
|
||
namespace YLErp.CustomizedBizLogic
|
||
{
|
||
public class BizLogicGTJA : BizLogicDefault
|
||
{
|
||
//-------------------------------------------------------
|
||
// 交易编号规则:
|
||
// 商品类以客户编号开头,中间标识为C
|
||
// 权益类以OTC开头,如果客户编号以CW开头则替换为OTC,中间标识为E
|
||
// 客户编号规则在3.5版本后以OTC开头旧版以CW开头
|
||
// 举例:如“老的客户(客户编号CW开始的), 新增权利类交易,编号强制 用OTC20180201E0001, 商品还是 CW20180201C00xx。
|
||
// 举例:新的客户 客户编号 是 OTC20200201, 权益类交易 OTC20200201E0001 商品是 OTC20200201C0001 ”。
|
||
//-------------------------------------------------------
|
||
|
||
/// <summary>
|
||
/// 生成客户编号
|
||
/// 生成规则:例如 CW20180001 , CW为固定字符,加上4位年份, 最后四位是序列编号,从0001开始,每增加一个客户自动加1,序号最大值9999
|
||
/// </summary>
|
||
/// <param name="initialCode">客户创建时的初始编号,如果没有传null</param>
|
||
public override void GenerateClientCode(Client clientObj, IQueryable<Client> clientDbQuery)
|
||
{
|
||
const string prefix = "CW";
|
||
|
||
const int leftPartSize = 6;//CW+year
|
||
|
||
if (string.IsNullOrWhiteSpace(clientObj.Number) || clientObj.Number.IndexOf(prefix) != 0)
|
||
{
|
||
lock (_clientCodeLock)
|
||
{
|
||
var leftPart = prefix + DateTime.Now.Year.ToString();
|
||
var existingNumbers = clientDbQuery.Where(x => x.Number.StartsWith(leftPart)).Select(x => x.Number).ToArray();
|
||
var maxNumber = 0;
|
||
if (existingNumbers.Any())
|
||
{
|
||
maxNumber = existingNumbers.Max(x => int.TryParse(x.Substring(leftPartSize), out var number) ? number : 0);
|
||
}
|
||
clientObj.Number = leftPart + (maxNumber + 1).ToString().PadLeft(4, '0');
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 在交易确认前生成交易编号
|
||
/// </summary>
|
||
public override string GenerateTradeNumberBeforeConfirm(TradeNumberReqModel reqModel, YLContext db)
|
||
{
|
||
if (reqModel is null)
|
||
{
|
||
throw new ArgumentNullException(nameof(reqModel));
|
||
}
|
||
|
||
//对于对冲交易、场内交易等没有设置客户的
|
||
if (reqModel.clientId == 0)
|
||
{
|
||
return DateTime.Now.ToString("yyyyMMddHHmmssfff");
|
||
}
|
||
|
||
var clientNumber = DataCacheProvider.GetClientDataSource().GetData(reqModel.clientId)?.Number.TrimToNull();
|
||
|
||
string preTag = clientNumber ?? "N", midTag = "C";
|
||
var stockInstrumentTypes = new[] { InstrumentType.Stock, InstrumentType.StockIF };
|
||
var um = DataCacheProvider.GetUnderlyingDataSource().GetData(reqModel.trade.UnderlyingId);
|
||
//权益类场外交易编号处理
|
||
if (um != null && stockInstrumentTypes.Contains(um.UnderlyingInstrumentType))
|
||
{
|
||
var E_TradeTypes = new[] { "香草期权", "自定义交易", "结构化交易" };
|
||
midTag = E_TradeTypes.Contains(reqModel.trade.TradeType) && reqModel.trade.IsGroup == 0 ? "E" : "X";
|
||
//if (preTag.StartsWith("CW")) preTag = "OTC" + preTag.Substring(2);
|
||
}
|
||
|
||
//合并起来作为获取递增序号的取值条件
|
||
var leftPart = preTag + midTag;
|
||
var fullSize = leftPart.Length + 4;
|
||
|
||
//获取数据库该用户最大的交易编号记录
|
||
var tradeNumber = db.trade.Where(x => x.TradeNumber.StartsWith(leftPart) && x.TradeNumber.Length == fullSize)
|
||
.OrderByDescending(x => x.TradeNumber).Select(n => n.TradeNumber).FirstOrDefault() ?? string.Empty;
|
||
|
||
if (reqModel.importTrades != null && reqModel.importTrades.Any())
|
||
{
|
||
//获取导入交易中该客户最大的交易编号记录
|
||
var importTradeNumber = reqModel.importTrades.Where(x => x.TradeNumber.StartsWith(leftPart) && x.TradeNumber.Length == fullSize)
|
||
.OrderByDescending(x => x.TradeNumber).Select(n => n.TradeNumber).FirstOrDefault() ?? string.Empty;
|
||
tradeNumber = tradeNumber.CompareTo(importTradeNumber) > 0 ? tradeNumber : importTradeNumber;
|
||
}
|
||
|
||
//获取总的该用户最大的交易编号记录
|
||
int newNumber = string.IsNullOrWhiteSpace(tradeNumber) ? 1 : (int.Parse(tradeNumber.Substring(leftPart.Length)) + 1);
|
||
|
||
return getTradeNumber(newNumber, leftPart, db);
|
||
}
|
||
|
||
private string getTradeNumber(int newNumber, string leftPart, YLContext db)
|
||
{
|
||
if (newNumber < 1e4)
|
||
{
|
||
var childTradeNumberPart = leftPart + newNumber.ToString("D4") + "-";
|
||
if (db.trade.Any(x => EF.Functions.Like(x.TradeNumber,$"{childTradeNumberPart}%") && x.ValidState != "InValid"))
|
||
{
|
||
return getTradeNumber(newNumber + 1, leftPart, db);
|
||
}
|
||
else
|
||
{
|
||
return leftPart + newNumber.ToString("D4");
|
||
}
|
||
}
|
||
else
|
||
{
|
||
throw new Exception("该客户存在最大交易编号" + (newNumber - 1) + ",超出了限制规则9999,生成交易编号失败");
|
||
}
|
||
}
|
||
}
|
||
}
|