using YLErp.BLL; using YLErp.Helpers; using YLErp.Modules; namespace YLErp.CustomizedBizLogic { class BizLogicXingZheng : BizLogicDefault { /// /// 生成交易编号 /// public override string GenerateTradeNumberBeforeConfirm(TradeNumberReqModel reqModel, YLContext db) { if (reqModel is null) { throw new ArgumentNullException(nameof(reqModel)); } if (!reqModel.trade.TradeDate.HasValue) { throw new BizLogicException("交易日期不存在"); } if (!string.IsNullOrWhiteSpace(reqModel.trade.TradeNumber)) { return reqModel.trade.TradeNumber; } var client = DataCacheProvider.GetClientDataSource().GetData(reqModel.clientId); if (client == null) { throw new BizLogicException("客户信息不存在"); } if (client.Number.IsNullOrWhiteSpace()) { throw new BizLogicException("客户编号不存在"); } string codePrefix; //当等于远期时,判断是否累计转的,如果是远期编号规则 -> 用累计的交易编号 + 当前累计转的远期数量 if (reqModel.trade.TradeType == "远期" && reqModel.trade.MetaDic.TryGetValue("累计期权交易编号", out var mainNumber) && !string.IsNullOrWhiteSpace(mainNumber)) { codePrefix = mainNumber + "-"; } else { codePrefix = $"{reqModel.trade.TradeDate.Value:yyMMdd}{client.Number}"; } var tradeNumbers = new List(); tradeNumbers = db.trade.Where(x => x.TradeNumber.StartsWith(codePrefix) && x.ParentTradeId == 0).Select(x => x.TradeNumber).ToList(); //获取导入 if (reqModel.importTrades != null) { tradeNumbers.AddRange(reqModel.importTrades.Select(O => O.TradeNumber)); } var number = tradeNumbers.Count; var code = ""; do { number++; code = $"{codePrefix}{number:00}"; if (!tradeNumbers.Contains(code)) { break; } } while (true); return code; } public override void GenerateClientCode(Client clientObj, IQueryable clientDbQuery) { if (!string.IsNullOrEmpty(clientObj.Number)) { return; } lock (_clientCodeLock) { var date = clientObj.ProtocolSignDate; if (!date.HasValue) { throw new ServiceException("生成客户编号失败,因尚未填写商品类签署日期,客户名称:" + clientObj.Name); } var code = ""; var existingClientCodes = clientDbQuery.Where(x => x.Number != null && x.Number != "").Select(x => x.Number).ToList(); var number = existingClientCodes.Count; do { number++; code = number.ToString("0000"); if (!existingClientCodes.Contains(code)) { break; } } while (true); clientObj.Number = code; } } } }