using System.Text.RegularExpressions; using YLErp.BLL; namespace YLErp.CustomizedBizLogic { /// /// 上期资本 /// class BizLogicSQ : BizLogicDefault { public override string GenerateTradeNumberBeforeConfirm(TradeNumberReqModel reqModel, YLContext db) { if (reqModel is null) { throw new ArgumentNullException(nameof(reqModel)); } if (!string.IsNullOrWhiteSpace(reqModel.trade.TradeNumber)) { return reqModel.trade.TradeNumber; } lock (_clientCodeLock) { string code = ""; var clientObj = GetClient(reqModel.clientId); if (clientObj == null) { throw new Exception("未找到客户信息!"); } if (!clientObj.ProtocolSignDate.HasValue) { throw new Exception("生成合同编号失败,请先添加客户商品类协议签署日期!"); } if (reqModel.trade.TradeDate == null) { throw new Exception("生成合同编号失败,请先确认该交易成交日期!"); } string prefix = $"{clientObj.Number}-JY-{reqModel.trade.TradeDate?.ToString("yyyyMMdd")}"; var tradeNumbers = db.trade .Where(O => O.TradeNumber.StartsWith(prefix) && O.ValidState != "InValid").Select(O => O.TradeNumber).OrderByDescending(O => O); var tradeNumber = tradeNumbers.FirstOrDefault(); int tradeCount = 0; if (string.IsNullOrWhiteSpace(tradeNumber) || !int.TryParse(tradeNumber.Substring(prefix.Length), out tradeCount)) { tradeCount = 0; } do { tradeCount++; code = $"{prefix}{tradeCount:00}"; } while (tradeNumbers.Contains(code)); return code; } } public override void GenerateClientCode(Client clientObj, IQueryable clientDbQuery) { if (!string.IsNullOrEmpty(clientObj.Number)) { return; } if (!clientObj.ProtocolSignDate.HasValue) { throw new Exception("生成客户编号失败,请先添加客户商品类协议签署日期!"); } lock (_clientCodeLock) { DateTime date = DateTime.Now; string code = ""; string codePrefix = "SQCW[" + clientObj.ProtocolSignDate?.ToString("yyyyMMdd") + "]";// "OTC"; var existingClientCodes = clientDbQuery.Where(o => o.Number != null && o.Number.StartsWith(codePrefix)) .Select(x => x.Number).OrderByDescending(O => O); var existingClientCode = existingClientCodes.FirstOrDefault(); int number = 0; if (!string.IsNullOrWhiteSpace(existingClientCode)) { Match maxCode = null; if ((maxCode = Regex.Match(existingClientCode, @"\d+$")).Success) { number = int.Parse(maxCode.Value); } } do { number++; code = codePrefix + number.ToString("0000"); if (!existingClientCodes.Contains(code)) { break; } } while (true); clientObj.Number = code; } } } }