using YLErp.BLL; using YLErp.Modules; namespace YLErp.CustomizedBizLogic { public class BizLogicDongWu : BizLogicDefault { //客户编号+开仓日期YYMMDD+当日笔数+交易方向+标的分类 /// /// 生成交易编号 /// /// /// /// public override string GenerateTradeNumberBeforeConfirm(TradeNumberReqModel reqModel, YLContext db) { //判断交易编号Model是否为空 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("交易日期不存在,无法生成交易编号!"); } string mark = ""; var um = DataCacheProvider.GetUnderlyingDataSource().GetData(reqModel.trade.UnderlyingCode); if (um != null && (um.IsStock() || um.IsStockIF() || um.IsStockIndex())) { mark = "EQU"; } else { mark = "COM"; } string code = ""; //根据客户Id查询出来该条数据 var client = DbContextFactory.GetClientDbContext(null).client.Where(x => x.id == reqModel.clientId).FirstOrDefault(); if (client == null) { throw new Exception("未找到客户"); } //取出客户编号 string clientNumber = client.Number; //取出当前开仓时间 string tradeDate = reqModel.trade.TradeDate?.ToString("yyMMdd"); string Separator = "-"; //当日交易笔数 code = $"{ clientNumber}{Separator}{tradeDate}"; //定义交易方向变量 var transaction = ""; if (reqModel.trade.TradeType == "收益互换") { transaction = (reqModel.trade.trade_swap.GetTradePrice ?? 0) - (reqModel.trade.trade_swap.PayTradePrice ?? 0) == 0 ? (reqModel.trade.trade_swap.IsPayFloatingProfit ? "-B-" : "-S-") : ((reqModel.trade.trade_swap.GetTradePrice ?? 0) - (reqModel.trade.trade_swap.PayTradePrice ?? 0) > 0 ? "-B-" : "-S-"); } else if (reqModel.trade.TradeType == "远期") { //判断远期期权多头/空头 if (reqModel.trade.OptionType == "看涨") { transaction = "-B-"; } else { transaction = "-S-"; } } else { //交易方向 transaction = reqModel.trade.BuySell == "买入" ? "-S-" : "-B-"; } var tradeNumbers = new List(); tradeNumbers = db.trade.Where(x => x.TradeNumber.StartsWith(code) && x.TradeNumber.Contains(transaction) && x.ParentTradeId == 0).Select(x => x.TradeNumber).ToList(); //获取导入 if (reqModel.importTrades != null) { tradeNumbers.AddRange(reqModel.importTrades.Where(O => string.IsNullOrEmpty(O.TradeNumber)).Select(O => O.TradeNumber)); } string ergodic = ""; //当前笔数 int number = tradeNumbers.Count; do { number++; ergodic = code + number.ToString("-000") + transaction + mark; if (!tradeNumbers.Contains(ergodic)) { break; } } while (true); return ergodic; } /// /// 生成客户编号 /// /// /// public override void GenerateClientCode(DBModels.Client clientObj, IQueryable clientDbQuery) { //判断客户编号是否为空 if (!string.IsNullOrEmpty(clientObj.Number)) { return; } lock (clientDbQuery) { //定义变量 string code = ""; string codePrefix = ""; if (clientObj.IsInsided == 1) { codePrefix = "D"; } else { if (clientObj.ClientType == "机构") { codePrefix = "E"; } else if (clientObj.ClientType == "产品") { if (string.IsNullOrWhiteSpace(clientObj.Abbreviation)) { throw new ServiceException("客户类型为产品时,简称不能为空"); } codePrefix = "F"; } else { throw new ServiceException("客户选择客户类别,当前仅支持[结构/产品],请重新设定!"); } } //根据客户编号将该类型都查询出来 var existingClientCodes = clientDbQuery.Where(x => x.Number.StartsWith(codePrefix)).Select(x => x.Number).ToList(); int number = existingClientCodes.Count; do { number++; code = codePrefix + number.ToString("0000"); //如果是产品则后面会加上客户简称 if (codePrefix == "F") { code = code + "-" + clientObj.Abbreviation; } if (!existingClientCodes.Contains(code)) { break; } } while (true); clientObj.Number = code; } } } }