using YLErp.BLL; using YLErp.Modules; namespace YLErp.CustomizedBizLogic { public class BizLogicGXJY : BizLogicDefault { /// /// 生成客户编号 /// 生成规则:客户编号 CW21000001, CW开头,21代表年份,21年签约的客户,后面6位是累加。 /// /// 客户创建时的初始编号,如果没有传null public override void GenerateClientCode(Client clientObj, IQueryable clientDbQuery) { const string prefix = "CW"; const int leftPartSize = 4;//CW+year if (string.IsNullOrWhiteSpace(clientObj.Number) || clientObj.Number.IndexOf(prefix) != 0) { lock (_clientCodeLock) { var leftPart = prefix + DateTime.Now.Year.ToString().Substring(2,2); 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(6, '0'); } } } /// /// 在交易确认前生成交易编号 /// 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 clientMainProtocolCode = DataCacheProvider.GetClientDataSource().GetData(reqModel.clientId)?.MainProtocolCode.TrimToNull(); if (string.IsNullOrEmpty(clientMainProtocolCode)) { throw new ServiceException("找不到该数据主协议编号"); } string preTag = clientMainProtocolCode ?? "N"; //合并起来作为获取递增序号的取值条件 var leftPart = preTag ; var fullSize = leftPart.Length + 3; //获取数据库该用户最大的交易编号记录 var tradeNumbers = db.trade.Where(x => x.TradeNumber.StartsWith(leftPart) && x.TradeNumber.Length >= fullSize) .OrderByDescending(x => x.TradeNumber).Select(n => n.TradeNumber).ToList() ; var numberStrings = tradeNumbers.Select(x => x.Substring(leftPart.Length).IndexOf('-')>0? x.Substring(leftPart.Length).Remove(x.Substring(leftPart.Length).IndexOf('-')): x.Substring(leftPart.Length)).Where(x => int.TryParse(x, out var num)); var number = numberStrings.LongCount()>0? numberStrings.Max(x => int.TryParse(x,out int a)?a:0):0; 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; int importNumber = int.TryParse(importTradeNumber, out var i) ? i : 0; number = number> importNumber ? number : importNumber; } //获取总的该用户最大的交易编号记录 int newNumber = number==0 ? 1 : (number + 1); //获取提前终止数量 var tradeUnwindConfirmationNumbers = db.trade_contract_r.Where(l => l.TradeNumber.StartsWith(leftPart) && l.TradeNumber.Length >= fullSize && l.Type == "提前终止确认书" && l.IsValid).Select(n => n.ContractCode).ToList(); var tradeUnwindConfirmationNumberStrings = tradeUnwindConfirmationNumbers.Select(x => x.Contains(leftPart) ? (x.Substring(leftPart.Length).IndexOf('-') > 0 ? x.Substring(leftPart.Length).Remove(x.Substring(leftPart.Length).IndexOf('-')) : x.Substring(leftPart.Length)) : "1").Where(x => int.TryParse(x, out var num)); var tradeUnwindConfirmationCount = tradeUnwindConfirmationNumberStrings.Max(x => x); if (newNumber > (string.IsNullOrWhiteSpace(tradeUnwindConfirmationCount) ? 0 : (int.Parse(tradeUnwindConfirmationCount) + 1))) { return getTradeNumber(newNumber, leftPart, db); } else { return getTradeNumber(int.Parse(tradeUnwindConfirmationCount) + 1, leftPart, db); } } private string getTradeNumber(int newNumber, string leftPart, YLContext db) { if (newNumber < 1e3) { var childTradeNumberPart = leftPart + newNumber.ToString("D3") ; if (db.trade.Any(x => x.TradeNumber.Contains(childTradeNumberPart)&& db.trade_contract_r.Any(l => l.ContractCode.Contains(childTradeNumberPart) && l.Type == "提前终止确认书" && l.IsValid) && x.ValidState != "InValid")) { return getTradeNumber(newNumber + 1, leftPart, db); } else { return leftPart + newNumber.ToString("D3"); } } else { var childTradeNumberPart = leftPart + newNumber; if (db.trade.Any(x => x.TradeNumber.Contains(childTradeNumberPart) && db.trade_contract_r.Any(l => l.ContractCode.Contains(childTradeNumberPart) && l.Type == "提前终止确认书" && l.IsValid) && x.ValidState != "InValid")) { return getTradeNumber(newNumber + 1, leftPart, db); } else { return childTradeNumberPart; } } } } }