using YLErp.BLL; using YLErp.Modules; namespace YLErp.CustomizedBizLogic { public class BizLogicZL : BizLogicDefault { public override string GenerateTradeNumberBeforeConfirm(TradeNumberReqModel reqModel, YLContext db) { if (reqModel is null) { throw new ArgumentNullException(nameof(reqModel)); } if (reqModel.trade.TradeDate == null) { throw new Exception("生成合同编号失败,请先确认该交易成交日期!"); } var client = DataCacheProvider.GetClientDataSource().GetData(reqModel.clientId); if (client == null) { throw new Exception("未找到客户!"); } var code = ""; var trade = reqModel.trade; var prefix = ""; var um = DataCacheProvider.GetUnderlyingDataSource().GetData(trade.UnderlyingCode); if (trade.TradeType == "收益互换") { prefix = "SW-" + client.Number + "-" + trade.TradeDate?.ToString("yyyyMMdd") + "-" + um.UnderlyingCode + "-"; var tradeNumbers = db.trade.Where(O => O.TradeNumber.StartsWith(prefix) && O.ValidState != "InValid").Select(O => O.TradeNumber).OrderByDescending(O => O); var tradeNumber = tradeNumbers.FirstOrDefault(); var tradeCount = 1; if (string.IsNullOrWhiteSpace(tradeNumber) || !int.TryParse(tradeNumber.Substring(prefix.Length), out tradeCount)) { tradeCount = 1; } do { code = $"{prefix}{tradeCount}"; tradeCount++; } while (tradeNumbers.Contains(code)); } else { //期权累交易编号包含客户编号,但是序号在同一个交易日不区分客户,也就是同一个交易日,不同客户的序号也不能相同 var dataCode = ""; var tradeDateString = trade.TradeDate?.ToString("yyyyMMdd"); prefix = client.Number + "-" + tradeDateString; var tradeNumbers = db.trade.Where(O => O.TradeNumber.Contains(tradeDateString) && O.ValidState != "InValid").Select(O => O.TradeNumber).ToList(); var numberStrings = tradeNumbers.Where(x => x.Contains(tradeDateString)).Select(x => new { number = x.Substring(x.Length - 4), preString = x.Substring(0, x.Length - 4) }).Where(x => int.TryParse(x.number, out var num) && x.preString.Contains(tradeDateString)); var numberString = numberStrings.OrderByDescending(x => x.number).FirstOrDefault(); var number = 1; if (string.IsNullOrWhiteSpace(numberString?.number) || !int.TryParse(numberString?.number, out number)) { number = 1; } do { code = $"{prefix}{number.ToString().PadLeft(4, '0')}"; dataCode = $"{tradeDateString}{number.ToString().PadLeft(4, '0')}"; number++; } while (tradeNumbers.Any(x => x.Contains(dataCode))); } return code; } } }