780 lines
37 KiB
C#
780 lines
37 KiB
C#
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 根据方向类型查询处理,结合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;
|
||
}
|
||
|
||
/// <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 根据方向类型查询处理,结合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<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;
|
||
}
|
||
}
|
||
}
|