Files
zszq-trs/YLErpDAL/Modules/ClientModule/EntryexitBLL.cs
T

780 lines
37 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using BaseOUDAL;
using System.Linq.Expressions;
using YLErp.BLL.Eod;
using YLErp.BLL.EodSettlement;
using YLErp.Model;
using YLErp.Modules;
namespace YLErp.BLL
{
/// <summary>
/// 客户出入金
/// </summary>
public class EntryExitBLL
{
private readonly YLContext db = new YLContext();
/// <summary>
/// 系统中可以操作的方向
/// </summary>
public static List<string> EntryDirection_Remove = new List<string> { "收入", "支出" };
public static List<string> EntryDirection_Menu = new List<string> { "出金", "入金", "其他收入", "其他支出" };
public static List<string> DirectionType = new List<string> { "出金", "入金", "权利金支出", "权利金收入", "平仓/行权支出", "平仓/行权收入", "票息支出", "票息收入", "其他支出", "其他收入", "互换收入", "互换支出","应付预付金","预付金返息" };
/// <summary>
/// 现金交易方向
/// </summary>
public static List<string> EntryDirection = new List<string> { "出金", "入金", ClientCashInCashOut.应收 };
public static List<string> State = new List<string> { ClientCashInCashOut.未确认, ClientCashInCashOut.已结算, ClientCashInCashOut.已确认, ClientCashInCashOut.拒绝, ClientCashInCashOut.修改待确认 };
/// <summary>
/// 展示分组子交易资金信息
/// </summary>
/// <param name="req"></param>
/// <param name="includeHoliday"></param>
/// <returns></returns>
private Expression<Func<ClientCashInCashOut, bool>> CreatePredicate(EntryExitReq req, bool includeHoliday)
{
//IsGroup != 1代表不展示分组主交易资金信息
var predicate = PredicateBuilder.Create<ClientCashInCashOut>(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 根据方向类型查询处理,结合DirectionTradeActionInOut处理
//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;
}
/// <summary>
/// 展示分组主交易资金信息
/// </summary>
/// <param name="req"></param>
/// <param name="includeHoliday"></param>
/// <returns></returns>
private Expression<Func<ClientCashInCashOut, bool>> CreatePredicateWithGroup(EntryExitReq req, bool includeHoliday)
{
//IsGroup != 2代表不展示分组子交易资金信息
var predicate = PredicateBuilder.Create<ClientCashInCashOut>(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 根据方向类型查询处理,结合DirectionTradeActionInOut处理
//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<Func<Clientcashincashout_remove, bool>> CreatePredicate2(EntryExitReq req, bool includeHoliday)
{
var predicate = PredicateBuilder.Create<Clientcashincashout_remove>(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;
}
/// <summary>
/// 资金记录页面展示子交易资金信息
/// </summary>
/// <param name="req"></param>
/// <param name="gsum"></param>
/// <param name="getSum"></param>
/// <param name="includeHoliday"></param>
/// <returns></returns>
public SearchListResult<ClientCashInCashOutExtend> 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;
}
/// <summary>
/// 结算报告展示主交易资金记录信息
/// </summary>
/// <param name="req"></param>
/// <param name="gsum"></param>
/// <param name="getSum"></param>
/// <param name="includeHoliday"></param>
/// <returns></returns>
public SearchListResult<ClientCashInCashOutExtend> 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<ClientCashInCashOutExtend> 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<ClientCashInCashOutExtend> 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<ClientCashInCashOutExtend> 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<int> set = new HashSet<int>();
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<string, double> 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<string, double>();
}
return fundObject.TodayRemainFund;
}
}
}