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;
}
}
}