using System.Text.RegularExpressions; using YLErp.BLL; using YLErp.Modules; namespace YLErp.CustomizedBizLogic { public class BizLogicGldh : BizLogicDefault { /// /// 在交易确认前生成交易编号 /// /// public override string GenerateTradeNumberBeforeConfirm(TradeNumberReqModel reqModel, YLContext db) { if (reqModel is null) { throw new ArgumentNullException(nameof(reqModel)); } var client = DataCacheProvider.GetClientDataSource().GetData(reqModel.clientId); if (!reqModel.valueDate.HasValue) { reqModel.valueDate = valuedateBLL.ValueDate; } if (string.IsNullOrEmpty(client.Code)) { throw new Exception("该客户客户代码为空,生成交易编号失败"); } string preTag = $"{client.Code}-{reqModel.valueDate.Value.ToString("yyMMdd")}"; //获取数据库该用户当天最大的交易编号记录 var tradeNumber = db.trade.Where(x => x.ClientId == reqModel.clientId && reqModel.valueDate.Value == x.TradeDate && x.TradeNumber.StartsWith(preTag)) .OrderByDescending(x => x.TradeNumber).Select(n => n.TradeNumber).FirstOrDefault() ?? string.Empty; if (reqModel.importTrades != null && reqModel.importTrades.Count > 0) { //获取导入交易中该客户当天最大的交易编号记录 var importTradeNumber = reqModel.importTrades.Where(x => x.ClientId == reqModel.clientId && reqModel.valueDate.Value == x.TradeDate && x.TradeNumber.Contains(preTag)) .OrderByDescending(x => x.TradeNumber).Select(n => n.TradeNumber).FirstOrDefault() ?? string.Empty; tradeNumber = tradeNumber.CompareTo(importTradeNumber) > 0 ? tradeNumber : importTradeNumber; } //获取总的该用户当天最大的交易编号记录 int newNumber = 1; if (!string.IsNullOrWhiteSpace(tradeNumber) && tradeNumber.Length > preTag.Length) { var tradeNumStr = tradeNumber.Substring(preTag.Length); if (!string.IsNullOrEmpty(tradeNumStr) && tradeNumStr.IndexOf("-") > 0) { tradeNumStr = tradeNumStr.Substring(0, tradeNumStr.IndexOf("-")); } if (!string.IsNullOrEmpty(tradeNumStr)) { if (!int.TryParse(tradeNumStr, out newNumber)) { throw new ServiceFaultException("生成交易编号出错,未能从已存在的交易编号中解析出最大序号,此交易编号为:" + tradeNumber); } newNumber++; } } if (newNumber <= 999) { return preTag + newNumber.ToString("00"); } else { throw new Exception("该客户存在最大交易编号" + (newNumber - 1) + ",超出了限制规则999,生成交易编号失败"); } } public override void GenerateClientCode(Client clientObj, IQueryable clientDbQuery) { if (string.IsNullOrWhiteSpace(clientObj.Number)) { lock (_clientCodeLock) { var existClient = clientDbQuery.Where(x => x.Number.Length == 6).OrderByDescending(x => x.Number).FirstOrDefault(); int.TryParse(existClient?.Number, out var nextNum); nextNum += 1; if (nextNum < 1000000) { clientObj.Number = nextNum.ToString("D6"); } else { throw new Exception("系统中已存在最大客户编号999999,生成客户编号失败"); } } } } } }