using YLErp.BLL; using YLErp.Modules; namespace YLErp.CustomizedBizLogic { public class BizLogicWCZD : BizLogicDefault { /// /// 生成客户编号 -- 物产中大 /// /// 客户创建时的初始编号,如果没有传null public override void GenerateClientCode(Client clientObj, IQueryable clientDbQuery) { if (string.IsNullOrWhiteSpace(clientObj.Number)) { lock (_clientCodeLock) { var result = DateTime.Now.Year.ToString(); var existingClientCodes = clientDbQuery.Where(x => x.Number.StartsWith(result)).Select(x => x.Number).ToList(); var maxNumber = 0; if (existingClientCodes.Count > 0) { maxNumber = existingClientCodes.Max(x => ParseNumber(x.Substring(4))); } var nextNum = maxNumber + 1; if (nextNum < 1000) { result += nextNum.ToString("D3"); } else { //如果大于999,将生成20181000等字符串,需求是说不会大于1000的 result += nextNum.ToString(); } clientObj.Number = result; } } } /// /// 在交易确认前生成交易编号 /// public override string GenerateTradeNumberBeforeConfirm(TradeNumberReqModel reqModel, YLContext db) { if (reqModel is null) { throw new ArgumentNullException(nameof(reqModel)); } var tradeNumber = ""; var client = DataCacheProvider.GetClientDataSource().GetData(reqModel.clientId); if (reqModel.trade.TradeType == "结构化交易" && reqModel.trade.IsGroup == 0) { tradeNumber = GetTradeNumber(db, client.Number); } else { var result = $"{reqModel.trade.TradeDate.Value.ToString("yyyyMMdd")}-"; tradeNumber = GetTradeNumber(db, result); } if (reqModel.trade.SubTrades==null) { reqModel.trade.MetaDic["期货报送成交编号"] = GenerateWCZDNumber(db, reqModel.trade, reqModel.trade.TradeDate, 0, false); } return tradeNumber; } private static string GetTradeNumber(YLContext db, string result) { //获取数据库该用户最大的交易编号记录 var tradeNumbers = db.trade.Where(x => x.TradeNumber.ToUpper().StartsWith(result.ToUpper()) && x.ValidState != "InValid").Select(O => O.TradeNumber).OrderByDescending(O => O).ToList(); var tradeNumber = tradeNumbers.FirstOrDefault(); if (string.IsNullOrWhiteSpace(tradeNumber) || !int.TryParse(tradeNumber.Substring(result.Length).Split('-')[0], out var tradeCount)) { tradeCount = 0; } do { tradeCount++; tradeNumber = $"{result}{tradeCount.ToString("000")}"; } while (tradeNumbers.Contains(tradeNumber)); return tradeNumber; } /// /// 生成监管报送里面的成交编号 存入trademate /// /// public string GenerateWCZDNumber(YLContext db, OtcTradeBase trade, DateTime? date, int keyId,bool isSaveMate = true,int leg=0) { string strTradeDate = date?.ToString("yyyyMMdd")+"-"; string metaKey = "期货报送成交编号" + keyId; var tradeNumber = ""; if (keyId>0 && db.TradeMeta.Where(l=>l.MetaKey == metaKey).Any()) { return db.TradeMeta.Where(l => l.MetaKey == metaKey).First().MetaValue; } var tradeMetas = db.TradeMeta.Where(O => O.MetaValue.StartsWith(strTradeDate) && O.MetaKey.StartsWith("期货报送成交编号")); var tradeMetaNumbers = tradeMetas.Select(O => O.MetaValue); var num = tradeMetas.ToList().Count+ leg; do { num++; tradeNumber = $"{strTradeDate}{num.ToString("000")}"; } while (tradeMetaNumbers.Contains(tradeNumber)); if (isSaveMate) { TradeMeta meta = new TradeMeta { TradeId = trade.id, MetaKey = metaKey, MetaValue = tradeNumber, CreateTime = DateTime.Now }; db.TradeMeta.Add(meta); db.SaveChanges(); } return tradeNumber; } private int ParseNumber(string clientNumber) { int.TryParse(clientNumber, out var number); return number; } } }