using YLErp.BLL; using YLErp.Modules; namespace YLErp.CustomizedBizLogic { public class BizLogicHuaAn : BizLogicDefault { /// /// 生成客户编号 /// /// 客户创建时的初始编号,如果没有传null public override void GenerateClientCode(Client clientObj, IQueryable clientDbQuery) { const string HAZB = "HAZB"; const string CW = "CW"; if (string.IsNullOrWhiteSpace(clientObj.Number)) { lock (_clientCodeLock) { int date = clientObj.ProtocolSignDate?.Year ?? 0; string leftPart = ""; if (2017 <= date && date <= 2018) { leftPart = HAZB + "-" + CW + clientObj.ProtocolSignDate?.ToString("yyyy"); } else if (2019 <= date && date <= 2020) { leftPart = HAZB + clientObj.ProtocolSignDate?.ToString("yy") + CW + (string.IsNullOrEmpty(clientObj.RiskServiceDegreeName) ? "R0" : clientObj.RiskServiceDegreeName); } else if (date >= 2021) { leftPart = HAZB + clientObj.ProtocolSignDate?.ToString("yy") + CW; } var leftPartSize = leftPart.Length; 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(3, '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 client = DataCacheProvider.GetClientDataSource().GetData(reqModel.clientId); var clientNumber = client?.Number.TrimToNull(); int date = client.ProtocolSignDate?.Year ?? 0; //合并起来作为获取递增序号的取值条件 var leftPart = clientNumber + "-"; var fullSize = leftPart.Length + 3; if (2017 <= date && date <= 2018) { fullSize = leftPart.Length + 2; } //获取数据库该用户最大的交易编号记录 var tradeNumber = db.trade.Where(x => x.TradeNumber.StartsWith(leftPart) && x.TradeNumber.Length == fullSize) .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); if (newNumber < 1e3) { if (2017 <= date && date <= 2018) { return leftPart + newNumber.ToString("D2"); } return leftPart + newNumber.ToString("D3"); } else { throw new Exception("该客户存在最大交易编号" + (newNumber - 1) + ",超出了限制规则999,生成交易编号失败"); } } } }