using YLErp.BLL; namespace YLErp.CustomizedBizLogic { public class BizLogicXingYe : BizLogicDefault { //------------------------------------------------------- //交易编号优化:CIFDYYYYMMDDXX //前四个字母是CIFD,然后8位是开仓时间的年月日,最后两位是序号; //如果是一个组合,如牛市价差的话,两腿共用一个交易确认书编号,如:两腿分别是 CIFD2021090104-1 CIFD2021090104-2 //------------------------------------------------------- /// /// 生成客户编号 /// 生成规则:例如 CW20180001 , CW为固定字符,加上4位年份, 最后四位是序列编号,从0001开始,每增加一个客户自动加1,序号最大值9999 /// /// 客户创建时的初始编号,如果没有传null public override void GenerateClientCode(Client clientObj, IQueryable clientDbQuery) { const string prefix = "CW"; const int leftPartSize = 6;//CW+year if (string.IsNullOrWhiteSpace(clientObj.Number) || clientObj.Number.IndexOf(prefix) != 0) { lock (_clientCodeLock) { var leftPart = prefix + DateTime.Now.Year.ToString(); var existingNumbers = clientDbQuery.Where(x => x.Number.StartsWith(leftPart)).Select(x => x.Number).ToArray(); var maxNumber = 0; if (existingNumbers.Any()) { maxNumber = existingNumbers.Max(x => int.TryParse(x.Substring(leftPartSize), out var number) ? number : 0); } clientObj.Number = leftPart + (maxNumber + 1).ToString().PadLeft(4, '0'); } } } /// /// 在交易确认前生成交易编号 /// public override string GenerateTradeNumberBeforeConfirm(TradeNumberReqModel reqModel, YLContext db) { if (reqModel is null) { throw new ArgumentNullException(nameof(reqModel)); } //对于对冲交易、场内交易等没有设置客户的 if (reqModel.clientId == 0) { return DateTime.Now.ToString("yyyyMMddHHmmssfff"); } //合并起来作为获取递增序号的取值条件 var leftPart = "CIFD" + reqModel.trade.TradeDate?.ToString("yyyyMMdd"); //获取数据库该用户最大的交易编号记录 var tradeNumber = db.trade.Where(x => x.TradeNumber.StartsWith(leftPart) && x.ParentTradeId == 0).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)) .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)) + 1); return getTradeNumber(newNumber, leftPart, db); } private string getTradeNumber(int newNumber, string leftPart, YLContext db) { if (newNumber < 100) { var childTradeNumberPart = leftPart + newNumber.ToString("D2"); if (db.trade.Any(x => x.TradeNumber.Contains(childTradeNumberPart) && x.ValidState != "InValid")) { return getTradeNumber(newNumber + 1, leftPart, db); } else { return leftPart + newNumber.ToString("D2"); } } else { throw new Exception("该交易日最大交易编号" + (newNumber - 1) + ",超出了限制规则99,生成交易编号失败"); } } } }