using YLErp.BLL; using YLErp.Modules; using static YLErp.ConsGlobal; namespace YLErp.CustomizedBizLogic { public class BizLogicHaiTong : 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; } if (!reqModel.trade.TradeDate.HasValue) { throw new Exception("交易日期不存在,无法生成交易编号!"); } lock (_clientCodeLock) { string leftPart = ""; string RightPart = ""; string DatePart = ""; var stockInstrumentTypes = new[] { InstrumentType.Stock, InstrumentType.StockIF, InstrumentType.StockIndex }; var um = DataCacheProvider.GetUnderlyingDataSource().GetData(reqModel.trade.UnderlyingId); //权益类场外交易编号处理 //交易编号前缀优化,动态获取当前年份后2位 var y = DateTime.Now.Year.ToString().Substring(2); if (um != null && stockInstrumentTypes.Contains(um.UnderlyingInstrumentType)) { leftPart = y + "W02"; } else { leftPart = y + "W01"; } DatePart = reqModel.trade.TradeDate?.ToString("MMdd"); leftPart += DatePart; if (!string.IsNullOrWhiteSpace(reqModel.trade.StructureType) && reqModel.trade.TradeType != "自定义交易" && reqModel.trade.TradeType != "远期" || reqModel.trade.IsGroup == 1) { RightPart = "Z"; } else if (reqModel.trade.TradeType == "香草期权") { RightPart = "X"; } else { RightPart = "Q"; } var fullSize = leftPart.Length + 3 + RightPart.Length; var num = db.trade.Where(x => x.TradeNumber.Substring(leftPart.Length - 4, 4) == DatePart && x.TradeDate == reqModel.trade.TradeDate).Select(x => x.TradeNumber.Substring(leftPart.Length, 3)).OrderByDescending(x => x).FirstOrDefault(); int count = string.IsNullOrWhiteSpace(num) ? 0 : Convert.ToInt32(num); if (reqModel.importTrades != null && reqModel.importTrades.Any()) { //获取导入交易中该客户的交易编号记录 var numCount = reqModel.importTrades.Where(x => x.TradeNumber.Substring(leftPart.Length - 4, 4) == DatePart && x.TradeDate == reqModel.trade.TradeDate).Select(x => x.TradeNumber.Substring(leftPart.Length, 3)).OrderByDescending(x => x).FirstOrDefault(); int importCount = string.IsNullOrWhiteSpace(numCount) ? 0 : Convert.ToInt32(numCount); count = count + importCount; } int newNumber = count + 1; ////获取数据库该用户最大的交易编号记录 //var tradeNumber = db.trade.Where(x => x.TradeNumber.StartsWith(leftPart) && x.TradeNumber.EndsWith(RightPart) && 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, 3)) + 1); if (newNumber < 1e4) { return leftPart + newNumber.ToString("D3") + RightPart; } else { throw new Exception("该客户存在最大交易编号" + (newNumber - 1) + ",超出了限制规则9999,生成交易编号失败"); } } } public override void GenerateClientCode(Client clientObj, IQueryable clientDbQuery) { if (!string.IsNullOrEmpty(clientObj.Number)) { return; } lock (_clientCodeLock) { string code = ""; string codePrefix = ""; if (string.IsNullOrWhiteSpace(clientObj.ProperClientClass)) { throw new ServiceException("客户适当性类型 必须填写"); } if (clientObj.ProperClientClass.Contains("专业投资者")) { codePrefix = "F"; } else if (clientObj.ProperClientClass.Contains("普通投资者")) { codePrefix = "C"; } else if (clientObj.ProperClientClass.Contains("公司内部")) { codePrefix = "H"; } else { throw new Exception("适当性类型超出预期,当前仅支持[专业投资者/普通投资者/公司内部],请重新设定!"); } var existingClientCodes = clientDbQuery.Where(x => x.ProperClientClass == clientObj.ProperClientClass).Select(x => x.Number).ToList(); int number = existingClientCodes.Count; do { number++; code = codePrefix + number.ToString("0000"); if (!existingClientCodes.Contains(code)) { break; } } while (true); clientObj.Number = code; } } } }