using YLErp.BLL; using YLErp.DBModels.Converts; using YLErp.Helpers; using YLErp.Modules; using YLErp.Modules.TradeModule; namespace YLErp.CustomizedBizLogic { public class BizLogicGDGZ : BizLogicDefault { /// /// 生成客户编号 /// 生成规则:C01A开头+00001(5位序号),例:C01A00001 /// /// 客户创建时的初始编号,如果没有传null /// public override void GenerateClientCode(Client clientObj, IQueryable clientDbQuery) { var prefix = "C01A"; if (string.IsNullOrWhiteSpace(clientObj.Number)) { lock (_clientCodeLock) { string result; var index = new TradeContractBLL(0, "系统").GetRuleIndex(prefix); if (index < 100000) { result = index.ToString("D5"); } else { //如果大于99999,将生成C01A100000等字符串,需求是说不会大于100000的 result = index.ToString(); } clientObj.Number = prefix + result; } } } /// /// 在交易确认前生成交易编号 /// 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 (string.IsNullOrWhiteSpace(client.Abbreviation)) { throw new Exception("生成交易编号失败,请先添加客户简称"); } //相对行权价时,交易编号中要使用实际的行权价; var strike = reqModel.trade.Strike ?? 0; if (reqModel.trade.IsMoneynessOptionData) { strike *= (reqModel.trade.SpotPrice ?? 0); } var result = ""; if (reqModel.trade.StructureType == "结构化交易" && reqModel.trade.TradeNumber == "FWD") { result = $"{client.Abbreviation}{DateFormat(reqModel.trade.TradeDate.Value)}{DateFormat(reqModel.trade.ExerciseDate.Value)}{reqModel.trade.UnderlyingCode}FWD"; } else if (reqModel.trade.StructureType == "结构化交易" && reqModel.trade.TradeNumber == "SPD") { result = $"{client.Abbreviation}{DateFormat(reqModel.trade.TradeDate.Value)}{DateFormat(reqModel.trade.ExerciseDate.Value)}{reqModel.trade.UnderlyingCode}SPD"; } else if (reqModel.trade.StructureType == "跨式组合") { result = $"{client.Abbreviation}{DateFormat(reqModel.trade.TradeDate.Value)}{DateFormat(reqModel.trade.ExerciseDate.Value)}{reqModel.trade.UnderlyingCode}STD"; } else if (reqModel.trade.StructureType == "宽跨式组合") { result = $"{client.Abbreviation}{DateFormat(reqModel.trade.TradeDate.Value)}{DateFormat(reqModel.trade.ExerciseDate.Value)}{reqModel.trade.UnderlyingCode}STG"; } else { result = $"{client.Abbreviation}{DateFormat(reqModel.trade.TradeDate.Value)}{DateFormat(reqModel.trade.ExerciseDate.Value)}{reqModel.trade.UnderlyingCode}{(BuySellConvert.GetClientBuySell(reqModel.trade.BuySell) == "买入" ? "B" : "S")}{(reqModel.trade.OptionType == "看涨" ? "C" : "P")}K{DoubleFormat(strike, 4)}"; } #region 2019-08-09改为下面的逻辑 //var existCount = db.trade.Where(x => x.TradeNumber.Contains(result)).Count(); //var hasAddedCount = trades == null ? 0 : trades.Where(x => x.TradeNumber.Contains(result)).Count(); //if (existCount + hasAddedCount > 0) //{ // result = result + Convert.ToChar('A' + (existCount + hasAddedCount)); //} #endregion var tradeNumbers = db.trade.Where(x => x.TradeNumber.ToUpper().StartsWith(result.ToUpper())).Select(O => O.TradeNumber).ToList(); if (tradeNumbers.Where(x => x.ToUpper().Contains(result.ToUpper())).Any()) { var tempNumber = ""; var index = 1; do { tempNumber = result; tempNumber += DataHelper.ConvertToLetter(index++); } while (tradeNumbers.Where(x => x.ToUpper().Contains(tempNumber.ToUpper())).Any()); result = tempNumber; } return result; } private string DateFormat(DateTime date) { var month = date.Month.ToString(); if (date.Month == 10) { month = "A"; } else if (date.Month == 11) { month = "B"; } else if (date.Month == 12) { month = "C"; } var day = date.Day.ToString().PadLeft(2, '0'); return month + day; } /// /// 格式化Double /// /// /// 小数点后位数 /// 是否忽略小数点后的0 /// private string DoubleFormat(double? value, int num = 1, bool ignoreZero = true) { if (value == null) { return "0"; } if (Math.Floor(value.Value) == value) { return ((int)value).ToString(); } var fromatStr = "0"; if (num > 0) { fromatStr += ".".PadRight(num + 1, ignoreZero ? '#' : '0'); } return value.Value.ToString(fromatStr).Replace('.', 'D'); } } }