using TinyPinyin; using YieldChain.Helpers; using YLErp.BLL; using YLErp.DBModels; using YLErp.Modules; namespace YLErp.CustomizedBizLogic { public class BizLogicZheShang : BizLogicDefault { /// /// 在交易确认前生成交易编号 /// 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(); //合并起来作为获取递增序号的取值条件 var leftPart = string.Empty; var fullSize = 0; leftPart = $"GLMS-IS-{reqModel.trade.TradeDate:yyyyMMdd}"; 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 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,生成交易编号失败"); } } 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; } } } } }