125 lines
4.6 KiB
C#
125 lines
4.6 KiB
C#
using YieldChain.Helpers;
|
|
using YLErp.BLL;
|
|
using YLErp.DBModels;
|
|
using YLErp.Modules;
|
|
|
|
namespace YLErp.CustomizedBizLogic
|
|
{
|
|
/// <summary>
|
|
/// 国联证券业务逻辑
|
|
/// </summary>
|
|
public class BizLogicGuoLian : BizLogicDefault
|
|
{
|
|
/// <summary>
|
|
/// 在交易确认前生成交易编号
|
|
/// 格式:GL-{yyyyMMdd}-{序号}
|
|
/// </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");
|
|
}
|
|
|
|
// 国联格式:GLMS-{yyyyMMdd}-{4位序号}
|
|
var leftPart = $"GLMS-{reqModel.trade.TradeDate:yyyyMMdd}-";
|
|
var fullSize = leftPart.Length + 4;
|
|
|
|
// 获取数据库该用户最大的交易编号记录
|
|
var tradeNumber = db.trade.Where(x =>
|
|
x.TradeNumber.StartsWith(leftPart) &&
|
|
x.TradeNumber.Length == fullSize &&
|
|
x.ValidState != ConsGlobal.InValid)
|
|
.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 startNumber = string.IsNullOrWhiteSpace(tradeNumber)
|
|
? 1
|
|
: (int.Parse(tradeNumber.Substring(leftPart.Length)) + 1);
|
|
|
|
return GetTradeNumber(startNumber, leftPart, db);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取可用的交易编号(循环实现,避免递归栈溢出)
|
|
/// </summary>
|
|
private string GetTradeNumber(int startNumber, string leftPart, YLContext db)
|
|
{
|
|
for (int newNumber = startNumber; newNumber < 10000; newNumber++)
|
|
{
|
|
var candidate = leftPart + newNumber.ToString("D4");
|
|
var childTradeNumberPart = candidate + "-";
|
|
|
|
// 检查是否存在以该编号开头的子交易
|
|
bool exists = db.trade.Any(x =>
|
|
EF.Functions.Like(x.TradeNumber, $"{childTradeNumberPart}%") &&
|
|
x.ValidState != ConsGlobal.InValid);
|
|
|
|
if (!exists)
|
|
{
|
|
return candidate;
|
|
}
|
|
}
|
|
|
|
throw new Exception("该客户交易编号已达到最大限制9999,生成交易编号失败");
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取交易确认书前缀
|
|
/// </summary>
|
|
public override string GetTradeContractPrefix(string tradeNumber)
|
|
{
|
|
// 国联证券确认书前缀
|
|
return "GL-";
|
|
}
|
|
|
|
/// <summary>
|
|
/// 生成客户编号
|
|
/// 格式:{年份后两位}{3位序号}{拼音首字母}
|
|
/// </summary>
|
|
public override void GenerateClientCode(Client clientObj, IQueryable<Client> clientDbQuery)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(clientObj.Number))
|
|
{
|
|
var firstPY = PingYinHelper.GetFirstPinYin_Enhance(clientObj.Name);
|
|
var year = DateTime.Now.ToString("yy");
|
|
var result = "";
|
|
lock (_clientCodeLock)
|
|
{
|
|
var existingClientCodes = clientDbQuery
|
|
.Where(x => x.Number.StartsWith(year))
|
|
.Select(x => x.Number)
|
|
.ToList();
|
|
var number = existingClientCodes.Count();
|
|
do
|
|
{
|
|
number++;
|
|
result = year + number.ToString("000");
|
|
} while (existingClientCodes.Any(O => O.StartsWith(result)));
|
|
|
|
clientObj.Number = result + firstPY;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|