using YLErp.BLL; using YLErp.Modules; using YLErp.Modules.TradeModule; namespace YLErp.CustomizedBizLogic { /// /// 招证 /// public class BizLogicZhaoZheng : BizLogicDefault { /// /// 生成客户编号 /// /// /// public override void GenerateClientCode(DBModels.Client clientObj, IQueryable clientDbQuery) { //定义固定字段 var predfix = "9"; //判断客户编号是否为空 if (!string.IsNullOrEmpty(clientObj.Number)) { return; } var existsClientCodes = clientDbQuery.Where(x => x.Number != null && x.Number != "" && x.Number.Length == 8 && x.Number.StartsWith(predfix)).Select(x => x.Number).ToList(); var number = 0; if (existsClientCodes.Any()) { //获取最大客户编号 number = existsClientCodes.Select(x => /*Regex.IsMatch(x, @"^[0-9]*$")*/int.TryParse(x, out var o) ? o : 0).Max(); } if (number == 0) { number = 90000000; } number++; clientObj.Number = number.ToString(); } /// /// 在交易确认前生成交易编号 /// public override string GenerateTradeNumberBeforeConfirm(TradeNumberReqModel reqModel, YLContext db) { if (reqModel is null) { throw new ArgumentNullException(nameof(reqModel)); } //根据客户Id查询出该客户 var client = DataCacheProvider.GetClientDataSource().GetData(reqModel.clientId); if (client == null) { throw new Exception("未找到客户"); } //取出客户编号 var clientNumber = client.Number; //判断客户编号是否为空 if (string.IsNullOrWhiteSpace(clientNumber)) { throw new Exception("客户编号不能为空"); } //判断开仓时间是否为空 if (!reqModel.trade.TradeDate.HasValue) { throw new Exception("交易日期不存在,无法生成交易编号!"); } var date = reqModel.trade.TradeDate?.ToString("yyyyMMdd"); // LogFactory.GetLogger("招证").Info("开始生成交易编号"); var dealNumber = GenerateZhaoZhengDealNumber(reqModel.trade, date, O => { return db.trade.Where(t => t.TradeNumber.StartsWith(O)).Select(O => O.TradeNumber).ToArray(); });//获取 reqModel.trade.MetaDic ??= new Dictionary(); reqModel.trade.MetaDic["期货报送成交编号"] = dealNumber; return dealNumber; } /// /// 生成招证成交编号 /// /// /// /// /// 了结时:TradeCashId /// /// public string GenerateZhaoZhengDealNumber(OtcTradeBase trade, trade_cash tradeCash) { if (trade is null) { throw new ArgumentNullException(nameof(trade)); } if (tradeCash is null) { throw new ArgumentNullException(nameof(tradeCash)); } var date = tradeCash.ValueDate.ToString("yyyyMMdd"); var metaKey = "期货报送成交编号" + tradeCash.id; var service = new TradeMetaService(new OptUserInfo(trade.OptId, trade.OptName, OptUserFrom.WebUI)); var dealNumber = service.GetTradeMeta(trade.id, metaKey); if (string.IsNullOrWhiteSpace(dealNumber)) { dealNumber = null; if (trade.ParentTradeId > 0 && trade.IsGroup == 0 && tradeCash.Action != ClientCashInCashOut.系统操作_期权费) { using var db = DbContextFactory.GetYLDbContext(); var prefix = GetZhaoZhengDealNumberPrefix(trade, date, out _); var metaQuery = from tc in db.trade_cash join td in db.trade on tc.TradeId equals td.id join meta in db.TradeMeta on tc.TradeId equals meta.TradeId where td.id != trade.id && td.ParentTradeId == trade.ParentTradeId && tc.ValueDate == tradeCash.ValueDate && tc.Action == tradeCash.Action && tc.ValidState != ConsGlobal.InValid && !tc.IsDeleted && meta.MetaKey.StartsWith("期货报送成交编号") && meta.MetaValue.StartsWith(prefix) select new { meta.MetaValue }; var metaDto = metaQuery.FirstOrDefault(); if (!string.IsNullOrEmpty(metaDto?.MetaValue)) { dealNumber = metaDto.MetaValue; } } //LogFactory.GetLogger("招证").Info($"开始生成交易编号{metaKey}"); dealNumber ??= GenerateZhaoZhengDealNumber(trade, date);//获取 new TradeMetaService(new OptUserInfo(trade.OptId, trade.OptName, OptUserFrom.WebUI)).AddTradeMeta(trade.id, metaKey, dealNumber); // LogFactory.GetLogger("招证").Info($"开始生成交易编号保存结果{dealNumber}"); } return dealNumber; } /// /// 生成招证期货报送成交编号 /// /// /// private string GenerateZhaoZhengDealNumber(OtcTradeBase trade, string date, Func excludeListInvoke = null) { var contractNo = ""; var prefix = GetZhaoZhengDealNumberPrefix(trade, date, out _); var db = new YLContext(); var list = db.TradeMeta.Where(O => O.MetaKey.StartsWith("期货报送成交编号") && O.MetaValue.StartsWith(prefix)).Select(O => O.MetaValue).ToArray(); var count = list.Count(); if (excludeListInvoke != null) { var excludeList = excludeListInvoke(prefix); list = list.Concat(excludeList).ToArray(); } //LogFactory.GetLogger("招证").Info($"开始生成交易编号总数{count}"); do { count++; contractNo = $"{prefix}{count:0000}"; // LogFactory.GetLogger("招证").Info($"开始生成交易编号最终生成:{contractNo}"); } while (list.Contains(contractNo)); return contractNo; } private static string GetZhaoZhengDealNumberPrefix(OtcTradeBase trade, string date, out Client client) { client = DataCacheProvider.GetClientDataSource().GetData(trade.ClientId) ?? throw new ServiceFaultException($"找不到客户信息,client id:{trade.ClientId},client name:{trade.ClientName}"); var tradeType = trade.TradeType switch { "收益互换" => "SW", "远期" => "FW", "现金流交易" => "OT", _ => "OP", }; return $"{tradeType}-{client.Number}-{date}"; } } }