using BaseOUDAL; using System.Linq.Expressions; using YLErp.BLL.Eod; using YLErp.BLL.EodSettlement; using YLErp.Model; using YLErp.Modules; namespace YLErp.BLL { /// /// 客户出入金 /// public class EntryExitBLL { private readonly YLContext db = new YLContext(); /// /// 系统中可以操作的方向 /// public static List EntryDirection_Remove = new List { "收入", "支出" }; public static List EntryDirection_Menu = new List { "出金", "入金", "其他收入", "其他支出","划转" }; public static List TransferAccount = new List { "初保账户", "追保账户", "已实现盈亏" }; public static List DirectionType = new List { "出金", "入金", "划转", "权利金支出", "权利金收入", "平仓/行权支出", "平仓/行权收入", "票息支出", "票息收入", "其他支出", "其他收入", "互换收入", "互换支出","应付预付金","预付金返息" }; /// /// 现金交易方向 /// public static List EntryDirection = new List { "出金", "入金", ClientCashInCashOut.应收 }; public static List State = new List { ClientCashInCashOut.未确认, ClientCashInCashOut.已结算, ClientCashInCashOut.已确认, ClientCashInCashOut.拒绝, ClientCashInCashOut.修改待确认 }; /// /// 展示分组子交易资金信息 /// /// /// /// private Expression> CreatePredicate(EntryExitReq req, bool includeHoliday) { //IsGroup != 1代表不展示分组主交易资金信息 var predicate = PredicateBuilder.Create(n => n.ValidState != ConsGlobal.InValid && n.IsGroup != 1); if (req.CurUserClientIds != null) { predicate = predicate.And(d => req.CurUserClientIds.Contains(d.ClientId ?? 0)); } if (!string.IsNullOrEmpty(req.Ids)) { predicate = predicate.And(d => req.IdList.Contains(d.id)); } if (!string.IsNullOrEmpty(req.ClientIds) && req.ClientIdsInt.Count() > 0) { predicate = predicate.And(d => d.ClientId != null && req.ClientIdsInt.Contains(d.ClientId.Value)); } #region 根据方向类型查询处理,结合Direction,TradeAction,InOut处理 //Direction和TradeAction是或的关系 //Direction和InOut是或的关系 //TradeAction和InOut是与的关系(InTradeAction若有值和In为一组,判断为收取;OutTradeAction若有值和Out为一组,判断为支付) if (!string.IsNullOrEmpty(req.Direction) && !string.IsNullOrEmpty(req.TradeAction)) { predicate = predicate.And(d => d.Direction != null && req.Directions.Contains(d.Direction) || d.Action != null && req.TradeActionList.Contains(d.Action)); } else { if (!string.IsNullOrEmpty(req.Direction)) { predicate = predicate.And(d => d.Direction != null && req.Directions.Contains(d.Direction)); } if (!string.IsNullOrEmpty(req.TradeAction)) { predicate = predicate.And(d => d.Action != null && req.TradeActionList.Contains(d.Action)); } } //d.Direction != "应收"代表根据direction来做逻辑判断 if (!string.IsNullOrEmpty(req.InOut)) { if (req.InOut.Contains("应收") && !req.InOut.Contains("应付")) { if (req.IsCompany == 0) { predicate = predicate.And(d => d.Money > 0 || d.Direction != "应收"); } else { predicate = predicate.And(d => d.Money < 0 || d.Direction != "应收"); } } else if (!req.InOut.Contains("应收") && req.InOut.Contains("应付")) { if (req.IsCompany == 0) { predicate = predicate.And(d => d.Money < 0 || d.Direction != "应收"); } else { predicate = predicate.And(d => d.Money > 0 || d.Direction != "应收"); } } //当同时有应收和应付字段的时候,需要判断应收有哪些action,应付有哪些action else if (req.InOut.Contains("应收") && req.InOut.Contains("应付") && !string.IsNullOrEmpty(req.InTradeAction) && !string.IsNullOrEmpty(req.OutTradeAction)) { if (req.IsCompany == 0) { predicate = predicate.And(d => d.Money < 0 && req.OutTradeAction.Contains(d.Action) || d.Money > 0 && req.InTradeAction.Contains(d.Action) || d.Direction != "应收"); } else { predicate = predicate.And(d => d.Money > 0 && req.OutTradeAction.Contains(d.Action) || d.Money < 0 && req.InTradeAction.Contains(d.Action) || d.Direction != "应收"); } } } #endregion if (!string.IsNullOrEmpty(req.Number)) { predicate = predicate.And(d => d.Number.Contains(req.Number)); } if (req.OptId != null) { predicate = predicate.And(d => d.OptId == req.OptId); } if (!string.IsNullOrEmpty(req.SerialNumber)) { predicate = predicate.And(d => d.SerialNumber.Contains(req.SerialNumber)); } if (req.ClientId != null) { predicate = predicate.And(d => d.ClientId == req.ClientId); } if (!string.IsNullOrEmpty(req.ClientNumber)) { predicate = predicate.And(d => d.ClientNumber.Contains(req.ClientNumber)); } if (!string.IsNullOrEmpty(req.TradeNumber)) { var tradeIds = DbContextFactory.GetYLDbContext().trade.Where(O => O.TradeNumber.Contains(req.TradeNumber)).Select(O => O.id).ToList(); predicate = predicate.And(d => tradeIds.Contains(d.TradeId ?? 0) || d.ParentTradeNumber == req.TradeNumber); } if (!string.IsNullOrEmpty(req.ClientName)) { predicate = predicate.And(d => d.ClientName.Contains(req.ClientName)); } if (req.Money != null) { predicate = predicate.And(d => d.Money.Value == req.Money); } if (req.IsMoneyNotEqualsZero) { predicate = predicate.And(d => d.Money.Value != 0); } if (req.HappenDateStart != DateTime.MinValue) { if (includeHoliday) { //如果前一天是假日,要显示包含假日的交易 var preday = req.HappenDateStart.AddDays(-1); //获取前一天(非节假日的24点),因为HappenDate可以为日中 var nonHolidayAddOne = valuedateBLL.GetNonHolidayDefore(preday).AddDays(1); predicate = predicate.And(d => d.HappenDate >= nonHolidayAddOne); } else { predicate = predicate.And(d => d.HappenDate >= req.HappenDateStart); } } if (req.HappenDateEnd != DateTime.MinValue) { var HappenDateTemp = req.HappenDateEnd.AddDays(1); predicate = predicate.And(d => d.HappenDate < HappenDateTemp); } if (!string.IsNullOrEmpty(req.OpenBankCard)) { predicate = predicate.And(d => d.OpenBankCard.Contains(req.OpenBankCard)); } if (!string.IsNullOrEmpty(req.OptNames)) { predicate = predicate.And(d => req.IdLists.Contains((int)d.OptId)); } if (!string.IsNullOrEmpty(req.OptName)) { predicate = predicate.And(d => d.OptName.Contains(req.OptName)); } if (req.OptDateStart != DateTime.MinValue) { predicate = predicate.And(d => d.OptDate >= req.OptDateStart); } if (req.OptDateEnd != DateTime.MinValue) { var OptDateTemp = req.OptDateEnd.AddDays(1); predicate = predicate.And(d => d.OptDate < OptDateTemp); } return predicate; } /// /// 展示分组主交易资金信息 /// /// /// /// private Expression> CreatePredicateWithGroup(EntryExitReq req, bool includeHoliday) { //IsGroup != 2代表不展示分组子交易资金信息 var predicate = PredicateBuilder.Create(n => n.ValidState != ConsGlobal.InValid && n.IsGroup != 2); if (!string.IsNullOrEmpty(req.Ids)) { predicate = predicate.And(d => req.IdList.Contains(d.id)); } if (!string.IsNullOrEmpty(req.ClientIds) && req.ClientIdsInt.Count() > 0) { predicate = predicate.And(d => d.ClientId != null && req.ClientIdsInt.Contains(d.ClientId.Value)); } #region 根据方向类型查询处理,结合Direction,TradeAction,InOut处理 //Direction和TradeAction是或的关系 //Direction和InOut是或的关系 //TradeAction和InOut是与的关系(InTradeAction若有值和In为一组,判断为收取;OutTradeAction若有值和Out为一组,判断为支付) if (!string.IsNullOrEmpty(req.Direction) && !string.IsNullOrEmpty(req.TradeAction)) { predicate = predicate.And(d => d.Direction != null && req.Directions.Contains(d.Direction) || d.Action != null && req.TradeActionList.Contains(d.Action)); } else { if (!string.IsNullOrEmpty(req.Direction)) { predicate = predicate.And(d => d.Direction != null && req.Directions.Contains(d.Direction)); } if (!string.IsNullOrEmpty(req.TradeAction)) { predicate = predicate.And(d => d.Action != null && req.TradeActionList.Contains(d.Action)); } } //d.Direction != "应收"代表根据direction来做逻辑判断 if (!string.IsNullOrEmpty(req.InOut)) { if (req.InOut.Contains("应收") && !req.InOut.Contains("应付")) { if (req.IsCompany == 0) { predicate = predicate.And(d => d.Money > 0 || d.Direction != "应收"); } else { predicate = predicate.And(d => d.Money < 0 || d.Direction != "应收"); } } else if (!req.InOut.Contains("应收") && req.InOut.Contains("应付")) { if (req.IsCompany == 0) { predicate = predicate.And(d => d.Money < 0 || d.Direction != "应收"); } else { predicate = predicate.And(d => d.Money > 0 || d.Direction != "应收"); } } //当同时有应收和应付字段的时候,需要判断应收有哪些action,应付有哪些action else if (req.InOut.Contains("应收") && req.InOut.Contains("应付") && !string.IsNullOrEmpty(req.InTradeAction) && !string.IsNullOrEmpty(req.OutTradeAction)) { if (req.IsCompany == 0) { predicate = predicate.And(d => d.Money < 0 && req.OutTradeAction.Contains(d.Action) || d.Money > 0 && req.InTradeAction.Contains(d.Action) || d.Direction != "应收" || d.IsGroup == 1); } else { predicate = predicate.And(d => d.Money > 0 && req.OutTradeAction.Contains(d.Action) || d.Money < 0 && req.InTradeAction.Contains(d.Action) || d.Direction != "应收" || d.IsGroup == 1); } } } #endregion if (!string.IsNullOrEmpty(req.Number)) { predicate = predicate.And(d => d.Number.Contains(req.Number)); } if (req.OptId != null) { predicate = predicate.And(d => d.OptId == req.OptId); } if (!string.IsNullOrEmpty(req.SerialNumber)) { predicate = predicate.And(d => d.SerialNumber.Contains(req.SerialNumber)); } if (req.ClientId != null && req.ParentFlag) { //predicate = predicate.And(d => d.ClientId == req.ClientId); var lists = ClientBalanceUtility.GetSubclientId(req.ClientId.Value); predicate = predicate.And(d => lists.Contains(d.ClientId.Value)); } else if (req.ClientId != null && !req.ParentFlag) { predicate = predicate.And(d => d.ClientId == req.ClientId.Value); } if (!string.IsNullOrEmpty(req.ClientNumber)) { predicate = predicate.And(d => d.ClientNumber.Contains(req.ClientNumber)); } if (!string.IsNullOrEmpty(req.TradeNumber)) { var tradeIds = DbContextFactory.GetYLDbContext().trade.Where(O => O.TradeNumber.Contains(req.TradeNumber)).Select(O => O.id).ToList(); predicate = predicate.And(d => tradeIds.Contains(d.TradeId ?? 0)); } if (!string.IsNullOrEmpty(req.ClientName)) { predicate = predicate.And(d => d.ClientName.Contains(req.ClientName)); } if (req.Money != null) { predicate = predicate.And(d => d.Money.Value == req.Money); } if (req.IsMoneyNotEqualsZero) { //IsGroup == 1代表分组主交易需要展示,分组主交易money数据库为0,为了不影响结算,不和子交易算重了 predicate = predicate.And(d => d.Money.Value != 0 || d.IsGroup == 1); } if (req.HappenDateStart != DateTime.MinValue) { if (includeHoliday) { //如果前一天是假日,要显示包含假日的交易 var preday = req.HappenDateStart.AddDays(-1); //获取前一天(非节假日的24点),因为HappenDate可以为日中 var nonHolidayAddOne = valuedateBLL.GetNonHolidayDefore(preday).AddDays(1); predicate = predicate.And(d => d.HappenDate >= nonHolidayAddOne); } else { predicate = predicate.And(d => d.HappenDate >= req.HappenDateStart); } } if (req.HappenDateEnd != DateTime.MinValue) { var HappenDateTemp = req.HappenDateEnd.AddDays(1); predicate = predicate.And(d => d.HappenDate < HappenDateTemp); } if (!string.IsNullOrEmpty(req.State)) { var stateConditions = req.State.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); predicate = predicate.And(d => stateConditions.Contains(d.State)); } if (!string.IsNullOrEmpty(req.OpenBankCard)) { predicate = predicate.And(d => d.OpenBankCard.Contains(req.OpenBankCard)); } if (!string.IsNullOrEmpty(req.OptNames)) { predicate = predicate.And(d => req.IdLists.Contains((int)d.OptId)); } if (!string.IsNullOrEmpty(req.OptName)) { predicate = predicate.And(d => d.OptName.Contains(req.OptName)); } if (req.OptDateStart != DateTime.MinValue) { predicate = predicate.And(d => d.OptDate >= req.OptDateStart); } if (req.OptDateEnd != DateTime.MinValue) { var OptDateTemp = req.OptDateEnd.AddDays(1); predicate = predicate.And(d => d.OptDate < OptDateTemp); } return predicate; } private Expression> CreatePredicate2(EntryExitReq req, bool includeHoliday) { var predicate = PredicateBuilder.Create(n => n.ValidState != ConsGlobal.InValid); if (!string.IsNullOrEmpty(req.ClientIds) && req.ClientIdsInt.Count() > 0) { predicate = predicate.And(d => d.ClientId != null && req.ClientIdsInt.Contains(d.ClientId.Value)); } if (!string.IsNullOrEmpty(req.ClientName)) { predicate = predicate.And(d => d.ClientName.Contains(req.ClientName)); } return predicate; } /// /// 资金记录页面展示子交易资金信息 /// /// /// /// /// /// public SearchListResult SearchListExtend(EntryExitReq req, out EntryExitGridSum gsum, bool getSum = true, bool includeHoliday = false) { var predicate = CreatePredicate(req, includeHoliday); var query = from source in db.ClientCashInCashOut.Where(predicate) join up in db.clientcashincashout_update.Where(x => x.State == "修改待确认" && x.ValidState != ConsGlobal.InValid) on source.id equals up.ClientcashincashoutId into up from u in up.DefaultIfEmpty() join trade in db.trade on source.TradeId equals trade.id into trades from trade in trades.DefaultIfEmpty() join tradeCash in db.trade_cash on source.TradeCashId equals tradeCash.id into tradeCashs from tradeCash in tradeCashs.DefaultIfEmpty() join parentTrade in db.trade.Where(x => !string.IsNullOrEmpty(x.TradeNumber)) on source.ParentTradeNumber equals parentTrade.TradeNumber into parentTrades from parentTrade in parentTrades.DefaultIfEmpty() select new ClientCashInCashOutExtend { id = source.id, Direction = u != null ? u.NewDirection : source.Direction, TradeNumber = source.ParentTradeNumber ?? (trade == null ? "" : trade.TradeNumber), UnderlyingCode = trade == null ? "" : trade.UnderlyingCode, TradeType = trade == null ? "" : trade.TradeType, Number = source.Number, ClientId = source.ClientId, //ClientNumber = client.Number, //ClientName = client.Name, //OTC-3777 取开户管理中新增客户时填写的证照编号 //ClientIdentityNumber = client.LicenseCode, Money = u != null ? u.NewMoney : source.Money, CurrencyCode = source.CurrencyCode, HappenDate = u != null ? u.NewHappenDate : source.HappenDate, State = u != null ? "修改待确认" : source.State, //OpenBankId = bankcard != null ? bankcard.id + "" : null, //OpenBank = bankcard != null ? bankcard.Bank : null, //OpenBankCard = bankcard != null ? bankcard.Card : null, CreatorId = source.CreatorId, CreatorName = source.CreatorName, CreateDate = source.CreateDate, OptId = source.OptId, OptName = source.OptName, OptDate = source.OptDate, ValidState = source.ValidState, TradeId = source.TradeId, ParentTradeId = parentTrade == null ? 0 : parentTrade.id, Action = source.Action, SerialNumber = source.SerialNumber, Comments = source.Comments, TradeValidState=trade==null?"":trade.ValidState, cash_type = source.cash_type, //TradeNumber = source.TradeNumber }; query = query.Where(x=>x.TradeValidState!=ConsGlobal.InValid); if (string.IsNullOrEmpty(req.sidx)) { req.sidx = "HappenDate,id"; req.sord = "desc"; } if (!string.IsNullOrEmpty(req.State)) { var stateConditions = req.State.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); query = query.Where(d => stateConditions.Contains(d.State)); } var retListResult = query.ToSearchList(req); gsum = new EntryExitGridSum(); if (getSum && query.Any()) { gsum.MoneySum = retListResult.rows.Sum(q => q.Money * ("出金".Equals(q.Direction) ? -1 : 1)); gsum.MoneyInOutSum = retListResult.rows.Sum(q => ("出金".Equals(q.Direction) || "入金".Equals(q.Direction)) ? q.Money * ("出金".Equals(q.Direction) ? -1 : 1) : 0); gsum.MoneyPriceSum = retListResult.rows.Sum(q => "权利金".Equals(q.MoneyType) ? q.Money : 0); gsum.MoneyUnwindExerSum = retListResult.rows.Sum(q => "平仓行权".Equals(q.MoneyType) ? q.Money : 0); gsum.MoneyCouponSum = retListResult.rows.Sum(q => "票息".Equals(q.MoneyType) ? q.Money : 0); gsum.MoneySwapSum = retListResult.rows.Sum(q => "互换".Equals(q.MoneyType) ? q.Money : 0); gsum.MoneyOtherSum = retListResult.rows.Sum(q => ("其他支出".Equals(q.Direction) || "其他收入".Equals(q.Direction)) ? q.Money : 0); gsum.MoneySwapMarginSum = retListResult.rows.Sum(q => "预付金".Equals(q.MoneyType) ? q.Money : 0); } retListResult.Sum = gsum; foreach (var item in retListResult.rows) { if (item.ClientId > 0) { item.ClientName = DataCacheProvider.GetClientDataSource().GetData(item.ClientId.Value)?.Name; } } //SetClientInfo(retListResult.rows); return retListResult; } /// /// 结算报告展示主交易资金记录信息 /// /// /// /// /// /// public SearchListResult SearchListExtendWithGroup(EntryExitReq req, out EntryExitGridSum gsum, bool getSum = true, bool includeHoliday = false) { var predicate = CreatePredicateWithGroup(req, includeHoliday); var query = (from source in db.ClientCashInCashOut.Where(predicate) join trade in db.trade on source.TradeId equals trade.id into trades from trade in trades.DefaultIfEmpty() join tradeCash in db.trade_cash on source.TradeCashId equals tradeCash.id into tradeCashs from tradeCash in tradeCashs.DefaultIfEmpty() select new ClientCashInCashOutExtend { id = source.id, Direction = source.Direction, TradeNumber = trade == null ? "" : trade.TradeNumber, TradeType = trade == null ? "" : trade.TradeType, Number = source.Number, ClientId = source.ClientId, //ClientNumber = client.Number, //ClientName = client.Name, //OTC-3777 取开户管理中新增客户时填写的证照编号 //ClientIdentityNumber = client.LicenseCode, Money = req.IsCompany == 0 ? (source.IsGroup == 1 && tradeCash != null ? -tradeCash.Amount : source.Money) : -(source.IsGroup == 1 && tradeCash != null ? -tradeCash.Amount : source.Money), HappenDate = source.HappenDate, State = source.State, //OpenBankId = bankcard != null ? bankcard.id + "" : null, //OpenBank = bankcard != null ? bankcard.Bank : null, //OpenBankCard = bankcard != null ? bankcard.Card : null, OptId = source.OptId, OptName = source.OptName, OptDate = source.OptDate, ValidState = source.ValidState, TradeId = source.TradeId, Action = source.Action, SerialNumber = source.SerialNumber, Comments = source.Comments, CashFlag = (int)source.CashFlag, TradeValidState= trade == null ?"": trade.ValidState, //TradeNumber = source.TradeNumber }).Where(x => x.Money != 0&& x.TradeValidState != ConsGlobal.InValid); if (string.IsNullOrEmpty(req.sidx)) { req.sidx = "HappenDate,id"; req.sord = "desc"; } var retListResult = query.AsQueryable().ToSearchList(req); gsum = new EntryExitGridSum(); if (getSum && query.Any()) { gsum.MoneySum = retListResult.rows.Sum(q => q.Money * ("出金".Equals(q.Direction) ? -1 : 1)); gsum.MoneyInOutSum = retListResult.rows.Sum(q => ("出金".Equals(q.Direction) || "入金".Equals(q.Direction)) ? q.Money * ("出金".Equals(q.Direction) ? -1 : 1) : 0); gsum.MoneyPriceSum = retListResult.rows.Sum(q => "权利金".Equals(q.MoneyType) ? q.Money : 0); gsum.MoneyUnwindExerSum = retListResult.rows.Sum(q => "平仓行权".Equals(q.MoneyType) ? q.Money : 0); gsum.MoneyCouponSum = retListResult.rows.Sum(q => "票息".Equals(q.MoneyType) ? q.Money : 0); gsum.MoneySwapSum = retListResult.rows.Sum(q => "互换".Equals(q.MoneyType) ? q.Money : 0); gsum.MoneyOtherSum = retListResult.rows.Sum(q => ("其他支出".Equals(q.Direction) || "其他收入".Equals(q.Direction)) ? q.Money : 0); gsum.MoneySwapMarginSum= retListResult.rows.Sum(q => "预付金".Equals(q.MoneyType) ? q.Money : 0); } retListResult.Sum = gsum; //SetClientInfo(retListResult.rows); return retListResult; } public SearchListResult SearchListExtendRemove(EntryExitReq req, out EntryExitGridSum gsum, bool getSum = true, bool includeHoliday = false) { var predicate = CreatePredicate2(req, includeHoliday); var query = from source in db.Clientcashincashout_remove.Where(predicate) join trade in db.trade.Where(x => x.ValidState != ConsGlobal.InValid) on source.TradeId equals trade.id into trades from trade in trades.DefaultIfEmpty() select new ClientCashInCashOutExtend { id = source.id, Direction = source.Direction, TradeNumber = trade == null ? "" : trade.TradeNumber, TradeType = trade == null ? "" : trade.TradeType, Number = source.Number, ClientId = source.ClientId, //ClientNumber = client.Number, //ClientName = client.Name, //OTC-3777 取开户管理中新增客户时填写的证照编号 //ClientIdentityNumber = client.LicenseCode, Money = req.IsCompany == 0 ? source.Money : -source.Money, HappenDate = source.HappenDate, State = source.State, //OpenBankId = bankcard != null ? bankcard.id + "" : null, //OpenBank = bankcard != null ? bankcard.Bank : null, //OpenBankCard = bankcard != null ? bankcard.Card : null, OptId = source.OptId, OptName = source.OptName, OptDate = source.OptDate, ValidState = source.ValidState, TradeId = source.TradeId, Action = source.Action, SerialNumber = source.SerialNumber, Comments = source.Comments, TradeValidState = trade == null ? "" : trade.ValidState, //TradeNumber = source.TradeNumber }; query= query.Where(x => x.TradeValidState != ConsGlobal.InValid); if (string.IsNullOrEmpty(req.sidx)) { req.sidx = "HappenDate,id"; req.sord = "desc"; } var retListResult = query.ToSearchList(req); gsum = new EntryExitGridSum(); if (getSum && query.Any()) { gsum.MoneySum = retListResult.rows.Sum(q => q.Money * ("出金".Equals(q.Direction) ? -1 : 1)); gsum.MoneyInOutSum = retListResult.rows.Sum(q => ("出金".Equals(q.Direction) || "入金".Equals(q.Direction)) ? q.Money * ("出金".Equals(q.Direction) ? -1 : 1) : 0); gsum.MoneyPriceSum = retListResult.rows.Sum(q => "权利金".Equals(q.MoneyType) ? q.Money : 0); gsum.MoneyUnwindExerSum = retListResult.rows.Sum(q => "平仓行权".Equals(q.MoneyType) ? q.Money : 0); gsum.MoneyCouponSum = retListResult.rows.Sum(q => "票息".Equals(q.MoneyType) ? q.Money : 0); gsum.MoneySwapSum = retListResult.rows.Sum(q => "互换".Equals(q.MoneyType) ? q.Money : 0); gsum.MoneyOtherSum = retListResult.rows.Sum(q => ("其他支出".Equals(q.Direction) || "其他收入".Equals(q.Direction)) ? q.Money : 0); } retListResult.Sum = gsum; foreach (var item in retListResult.rows) { if (item.ClientId > 0) { item.ClientName = DataCacheProvider.GetClientDataSource().GetData(item.ClientId.Value)?.Name; } } //SetClientInfo(retListResult.rows); return retListResult; } public List SearchListExtendOnly(EntryExitReq req) { var predicate = CreatePredicateWithGroup(req, true); var query = (from source in db.ClientCashInCashOut.Where(predicate) join trade in db.trade on source.TradeId equals trade.id into trades from trade in trades.DefaultIfEmpty() join tradeCash in db.trade_cash on source.TradeCashId equals tradeCash.id into tradeCashs from tradeCash in tradeCashs.DefaultIfEmpty() select new ClientCashInCashOutExtend { id = source.id, Direction = source.Direction, Number = source.Number, TradeType = trade == null ? "" : trade.TradeType, ClientId = source.ClientId, //ClientNumber = client.Number, //ClientName = client.Name, //OTC-3777 取开户管理中新增客户时填写的证照编号 //ClientIdentityNumber = client.LicenseCode, Money = req.IsCompany == 0 ? (source.IsGroup == 1 && tradeCash != null ? -tradeCash.Amount : source.Money) : -(source.IsGroup == 1 && tradeCash != null ? -tradeCash.Amount : source.Money), HappenDate = source.HappenDate, State = source.State, CurrencyCode = source.CurrencyCode, //OpenBankId = test != null ? test.id + "" : null, //OpenBank = test != null ? test.Bank : null, //OpenBankCard = test != null ? test.Card : null, OptId = source.OptId, OptName = source.OptName, OptDate = source.OptDate, ValidState = source.ValidState, TradeId = source.TradeId, Action = source.Action, SerialNumber = source.SerialNumber, Comments = source.Comments, TradeNumber = trade == null ? source.TradeNumber : trade.TradeNumber, CashFlag = (int)source.CashFlag, TradeCashId = source.TradeCashId, TradeValidState = trade == null ? "" : trade.ValidState, }).Where(x => x.Money != 0 &&x.TradeValidState != ConsGlobal.InValid); var retListResult = query.OrderByDescending(x => x.HappenDate).ThenByDescending(x => x.id).ToList(); SetClientInfo(retListResult); return retListResult; } private void SetClientInfo(IEnumerable items) { if (!items.Any()) { return; } var clientIds = items.Select(n => n.ClientId ?? 0).ToHashSet(); using (var db = DbContextFactory.GetClientDbContext(null)) { var query = from c in db.client join cb in db.bankcard.Where(n => n.ApprovalOrder < 1) on c.id equals cb.ClientId into t_cb from cb in t_cb.DefaultIfEmpty() where clientIds.Contains(c.id) select new { c.id, c.Number, c.Name, //OTC-3777 取开户管理中新增客户时填写的证照编号 c.LicenseCode, cb = cb == null ? null : new { cb.id, cb.Bank, cb.Card } }; HashSet set = new HashSet(); var dic = query.ToArray().Where(c => set.Add(c.id)).ToDictionary(n => n.id); foreach (var item in items) { if (!dic.TryGetValue(item.ClientId ?? 0, out var c)) { continue; } item.ClientName = c.Name; item.ClientNumber = c.Number; //OTC-3777 取开户管理中新增客户时填写的证照编号 item.ClientIdentityNumber = c.LicenseCode; if (c.cb != null) { item.OpenBankId = c.cb.id + ""; item.OpenBank = c.cb.Bank; item.OpenBankCard = c.cb.Card; } } } } public Dictionary getClientCash(int clientId) { var client = DataCacheProvider.GetClientDataSource().GetData(clientId); var fundObject = new RealTimeClientBanlanceService(OptUserInfo.SystemUser).GetClientFundObject(client, valuedateBLL.ValueDate, true); if (fundObject == null) { return new Dictionary(); } return fundObject.TodayRemainFund; } } }