using YLErp.BLL; using YLErp.Modules; namespace YLErp.CustomizedBizLogic { public class BizLogicHuaXi : BizLogicDefault { /// /// 生成客户编号 -- 华西还要生成 主协议/补充协议/履保协议 /// /// 客户创建时的初始编号,如果没有传null public override void GenerateClientCode(Client clientObj, IQueryable clientDbQuery) { if (string.IsNullOrWhiteSpace(clientObj.Number)) { var result = "CW"; lock (_clientCodeLock) { result += DateTime.Now.Year.ToString(); var existingClientCodes = clientDbQuery.Where(x => x.Number.Contains(result)).Select(x => x.Number).ToList(); var maxNumber = 0; if (existingClientCodes.Count > 0) { maxNumber = existingClientCodes.Max(x => ParseNumber(x.Substring(6))); } var nextNum = maxNumber + 1; if (nextNum < 10000) { result += nextNum.ToString("D4"); } else { //如果大于9999,将生成CW201810000等字符串,需求是说不会大于10000的 result += nextNum.ToString(); } clientObj.Number = result; } } } /// /// 在交易确认前生成交易编号 /// 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 client = DataCacheProvider.GetClientDataSource().GetData(reqModel.clientId); const string SACO = "SACO-"; //期权 const string SACT = "SACT-"; //互换 const string company = "华西证券-"; string year = reqModel.trade.TradeDate?.ToString("yyyy") + "-"; //合并起来作为获取递增序号的取值条件 var leftPart = SACO + company + year; if (reqModel.trade.TradeType == "收益互换") { leftPart = SACT + company + year; } var XXleftPart = "XX" + leftPart; //获取数据库该用户最大的交易编号记录 var tradeNumber = db.trade.Where(x => x.TradeNumber.StartsWith(leftPart) || x.TradeNumber.StartsWith(XXleftPart)).Select(x => x.TradeNumber.Replace(leftPart, "").Replace("XX", "")).ToList(); if (reqModel.importTrades != null && reqModel.importTrades.Any()) { //获取导入交易中该客户最大的交易编号记录 var importTradeNumber = reqModel.importTrades.Where(x => x.TradeNumber.StartsWith(leftPart)).Select(x => x.TradeNumber.Replace(leftPart, "").Replace("XX", "")).ToList(); tradeNumber.AddRange(importTradeNumber); } var numberStrings = tradeNumber.Where(x => int.TryParse(x, out var num2)); var number = (numberStrings.LongCount() > 0 ? numberStrings.Max(x => int.TryParse(x, out int a) ? a : 0) : 0) + 1; if (number < 1e3) { return leftPart + number.ToString("D3"); } else { return leftPart + number.ToString(); } } private int ParseNumber(string clientNumber) { int.TryParse(clientNumber, out var number); return number; } } }