using System.Text.RegularExpressions; using YLErp.BLL; using YLErp.Modules; namespace YLErp.CustomizedBizLogic { class BizLogicHongYuan : 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) { Client clientObj = null; string code = ""; clientObj = DataCacheProvider.GetClientDataSource().GetData(reqModel.clientId); if (clientObj == null) { throw new Exception("未找到客户信息!"); } if (string.IsNullOrWhiteSpace(clientObj.Code)) { throw new Exception("生成合同编号失败,请先添加客户代码!"); } if (string.IsNullOrWhiteSpace(clientObj.Abbreviation)) { throw new Exception("生成合同编号失败,请先添加客户简称!"); } if (!clientObj.ProtocolSignDate.HasValue) { throw new Exception("生成合同编号失败,请先添加客户商品类协议签署日期!"); } string prefix = $"HL-{clientObj.Code}-{clientObj.ProtocolSignDate?.ToString("yyyy")}-{clientObj.Abbreviation}-SAC-01-1-TC"; var tradeNumbers = db.trade .Where(O => O.TradeNumber.StartsWith(prefix) && O.ValidState != "InValid").Select(O => O.TradeNumber).ToArray(); int tradeCount = tradeNumbers.Length; do { tradeCount++; code = $"{prefix}{tradeCount.ToString("000")}"; } while (tradeNumbers.Contains(code)); return code; } } public override void GenerateClientCode(Client clientObj, IQueryable clientDbQuery) { if (!string.IsNullOrEmpty(clientObj.Number)) { return; } lock (_clientCodeLock) { DateTime date = DateTime.Now; string code = ""; string codePrefix = "";// "OTC"; //var existingClientCodes = clientDbQuery.Where(o => o.Number != null/* && o.Number.StartsWith(codePrefix)*/).Select(x => x.Number).OrderByDescending(O => new { O.Length, O }).ToList(); var existingClientCodes = clientDbQuery.Where(o => !string.IsNullOrEmpty(o.Number)).Select(x => x.Number).ToList(); long number = existingClientCodes.Where(p => Regex.Match(p, @"^\d+$").Success).Select(p => long.Parse(Regex.Match(p, @"^\d+$").Value)).OrderByDescending(p=>p).FirstOrDefault(); //int number = 0; //Match maxCode = null; //for (int i = 0; i < existingClientCodes.Count; i++) //{ // if ((maxCode = Regex.Match(existingClientCodes[i], @"^\d+$")).Success) // { // number = int.Parse(maxCode.Value); // break; // } //} do { number++; code = codePrefix + number.ToString(); if (!existingClientCodes.Contains(code)) { break; } } while (true); clientObj.Number = code; } } } }