using YieldChain.Helpers; using YLErp.BLL; using YLErp.DBModels; using YLErp.Modules; namespace YLErp.CustomizedBizLogic { /// /// 国联证券业务逻辑 /// public class BizLogicGuoLian : BizLogicDefault { /// /// 在交易确认前生成交易编号 /// 格式:GL-{yyyyMMdd}-{序号} /// 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); } /// /// 获取可用的交易编号(循环实现,避免递归栈溢出) /// 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,生成交易编号失败"); } /// /// 获取交易确认书前缀 /// public override string GetTradeContractPrefix(string tradeNumber) { // 国联证券确认书前缀 return "GL-"; } /// /// 生成客户编号 /// 格式:{年份后两位}{3位序号}{拼音首字母} /// public override void GenerateClientCode(Client clientObj, IQueryable 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; } } } } }