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

117 lines
5.6 KiB
C#
Raw 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.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,生成交易编号失败");
}
}
}
}