using Dapper;
using DocumentFormat.OpenXml.Drawing.Charts;
using Microsoft.AspNetCore.Authorization;
using OfficeOpenXml;
using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;
using Org.BouncyCastle.Crypto.Tls;
using Org.BouncyCastle.Ocsp;
using YLErp.Abstract;
using YLErp.BLL.Eod;
using YLErp.BLL.EodSettlement;
using YLErp.Commons;
using YLErp.DataBase;
using YLErp.DBModels;
using YLErp.DBModels.Consts;
using YLErp.Enums;
using YLErp.Model.Enum;
using YLErp.Models.Tag;
using YLErp.Modules.ClientModule;
using YLErp.Modules.ClientModule.Dto;
using YLErp.Modules.EodModule.QueryModule;
using YLErp.Modules.ReportModule;
using YLErp.Modules.SalesModule;
using YLErp.Modules.SubAppModule.ClientApp;
using YLErp.Modules.SuperviseReportModule.SAC.Model;
using YLErp.Modules.SystemModule;
using YLErp.Modules.TagModule;
using YLErp.Modules.TradeDalModule;
using YLErp.Modules.TradeModule;
using YLErp.Modules.TradeModule.QueryModule;
using YLErp.Office;
using YLErp.Office.iTextModule;
using YLErp.QdpModule;
namespace YLErp.Web.Controllers
{
///
/// 客户信息控制器
///
public class ClientController : BaseController
{
readonly IViewRenderService _viewRenderer;
private IKafkaProduce _kafkaProduce;
public ClientController(IViewRenderService viewRenderer, IKafkaProduce kafkaProduce)
{
_viewRenderer = viewRenderer;
_kafkaProduce = kafkaProduce;
}
readonly ErpBaseContext basedb = new();
public JsonResult GetValidBankCard(int ClientId, string Direction)
{
var cards = clientDB.bankcard.Where(b => b.ApprovalOrder < 1 && b.ClientId == ClientId && b.ValidState == "Valid").ToList();
//if (CurUser.结算管理_出入金是否进行资金账户类型用途的校验)
//{
// var dictionaryName = new ClientCashImportService(CurUser).CheckCashAccountTypePermission(Direction);
// cards = cards.Where(b => dictionaryName.Contains(b.Use)).ToList();
//}
return JsonSuccessData(cards);
}
[MyAuthorize("风险控制-资金监控")]
public ActionResult clientRiskMonitor()
{
ViewBag.valueDate = valuedateBLL.ValueDate.ToString("yyyy-MM-dd");
//获取根据系统时间
ViewBag.lastSettledDate = EodOperationBase.GetLastSettlementDate(DateTime.Now.Date).ToString("yyyy-MM-dd");
return View();
}
[MyAuthorize("风险控制-资金监控")]
public ActionResult clientRiskMonitorBatchSend(string clientids, DateTime valuedate, string showntype)
{
ViewBag.ClientIds = clientids;
ViewBag.ValueDate = valuedate;
ViewBag.LuoKuanDesc = DBCacheManager.Single.GetStr(CacheTable.LuoKuanDesc);
ViewBag.MarginLuoKuanDesc = DBCacheManager.Single.GetStr(CacheTable.MarginLuoKuanDesc);
ViewBag.ShownType = showntype;
return View();
}
/*---------------------- client------------------------------*/
[MyAuthorize("客户管理-客户查看")]
public ActionResult ClientList()
{
var isCanle = CurUser.客户管理.客户销户;
ViewBag.isCanle = isCanle;
return View("ClientListV2");
}
[MyAuthorize("客户管理-客户查看")]
public ActionResult ClientListV2()
{
var isCanle = CurUser.客户管理.客户销户;
ViewBag.isCanle = isCanle;
return View();
}
[MyAuthorize("客户管理-客户查看")]
public ActionResult ClientExpireWarningList()
{
return View();
}
[MyAuthorize("客户管理-客户查看")]
public JsonResult ClientExpireWarningListJson(ExpireWarningReq req)
{
var sList = new ClientWarningService(CurUser).GetExpiresWarning(req);
return Json(sList);
}
[MyAuthorize("客户管理-客户查看")]
public JsonResult CheckedClientWarning()
{
var expireWarningStatus = new ClientWarningService(CurUser).CheckedClient();
return Json(expireWarningStatus);
}
[MyAuthorize("客户管理-客户查看")]
public JsonResult ClientExpireWarningUpdate(string enid)
{
var intid = DataProtectHelper.DecryptInt(enid);
new ClientWarningService(CurUser).UpdateWarning(intid);
return JsonSuccess("");
}
[MyAuthorize("客户管理-客户查看")]
public JsonResult ClientExpireWarningStatusJson(string enid)
{
var expireWarningStatus = new ClientWarningService(CurUser).GetExpireStatus();
return Json(expireWarningStatus);
}
///
/// 导出客户人员信息
///
public object ExportClientDuty(ClientReq req)
{
req.CurUserClientIds = CurUser.GetClientIdsByCustomerManager();
var sList = new ClientQueryService(CurUser).SearchList(req);
var bytes = new ClientDutyService(CurUser).ExportClientDutyToExcel(sList.rows.Select(o => o.id));
return File(bytes, xlsxMimeType, $"客户人员信息-{DateTime.Now:yyyy-MM-dd}.xlsx");
}
///
/// 导出客户银行卡信息
///
public object ExportClientBankCard(ClientReq req)
{
req.CurUserClientIds = CurUser.GetClientIdsByCustomerManager();
var sList = new ClientQueryService(CurUser).SearchList(req);
var bytes = new ClientBankCardService(CurUser).ExportBankCardsToExcel(sList.rows.Select(o => o.id));
return File(bytes, xlsxMimeType, $"客户银行卡信息-{DateTime.Now:yyyy-MM-dd}.xlsx");
}
///
/// 浙期-导出客户基本信息、人员信息、银行信息到一个xlsx中
///
///
///
public object ExportClientAll(ClientReq req)
{
req.ValueDate = valuedateBLL.ValueDate;
req.CheckContactExpired = true;
req.CurUserClientIds = CurUser.GetClientIdsByCustomerManager();
var service = new ClientQueryService(CurUser);
var sList = service.SearchList(req);
var appropriatenessAssessors = RoleRight.GetSystemUserByFunction("担任适当性评估人");
var salesDic = new Lazy>(() =>
{
return yldb.salesmen.Select(n => new { n.id, n.Name }).ToDictionary(n => n.id, m => m.Name);
});
foreach (var x in sList.rows)
{
if (AppHelper.UseFutureVersion("销售提成", "V2"))
{
if (!string.IsNullOrWhiteSpace(x.Seller))
{
var tempArray = x.Seller.Split(',');
var SalesmenNames = new List();
foreach (var item in tempArray)
{
if (int.TryParse(item, out var id) && id > 0
&& salesDic.Value.TryGetValue(id, out var name) && !string.IsNullOrWhiteSpace(name))
{
SalesmenNames.Add(name);
}
}
if (SalesmenNames != null && SalesmenNames.Any())
{
x.Seller = string.Join(",", SalesmenNames);
}
}
}
else if (!string.IsNullOrEmpty(x.Seller))
{
var tempArray = new List();
if (x.Seller.Contains(","))
{
tempArray = x.Seller.Split(',').Select(a => Convert.ToInt32(a)).ToList();
}
else
{
if (int.TryParse(x.Seller, out var a))
{
tempArray.Add(Convert.ToInt32(x.Seller));
}
}
if (tempArray.Any())
{
var salesmanNames = new SalesmenDataService(CurUser).GetSalesNamesByIds(tempArray).Select(o => o.Name);
if (salesmanNames.Any())
{
x.Seller = string.Join(",", salesmanNames);
}
}
}
if (x.SalesDepartmentId == null)
{
x.SalesDepartment = "";
}
else
{
var department = DepartmentsController.GetDepartmentById(x.SalesDepartmentId.Value);
x.SalesDepartment = department == null ? "" : department.Name;
}
x.AppropriatenessAssessorName = appropriatenessAssessors.Where(y => y.Id == x.AppropriatenessAssessor).FirstOrDefault() == null ? "" : appropriatenessAssessors.Where(y => y.Id == x.AppropriatenessAssessor).FirstOrDefault().Name;
if (!string.IsNullOrEmpty(x.CustomerManagerId))
{
if (x.CustomerManagerId.Contains(","))
{
var managerNames = new List();
var CustomerManagerIds = x.CustomerManagerId.Split(',').ToList();
CustomerManagerIds.ForEach(a =>
{
var manager = UserBLL.GetById(Convert.ToInt32(a));
if (manager != null)
{
managerNames.Add(manager.Name);
}
});
x.CustomerManager = managerNames.Any() ? string.Join(",", managerNames) : string.Empty;
}
else
{
var manager = UserBLL.GetById(Convert.ToInt32(x.CustomerManagerId));
x.CustomerManager = manager == null ? "" : manager.Name;
}
}
var deadLine = ClientLinqExtendService.GetEvaluateDate(x.EvaluateDate, x.EvaluateOfValidity);
x.AssessmentExpired = deadLine.Date <= DateTime.Now.Date;
x.AssessmentExpiredWithinThreeDays = deadLine > DateTime.Now.Date && deadLine.Date <= DateTime.Now.Date.AddDays(30).Date;
x.AssessmentExpiredDate = deadLine.ToString("yyyy-MM-dd");
x.HasDocuments = new ClientFileService(CurUser).hasDocments(x.id);
}
var colList = ClientEditConfigService.GetClientList();
var bytes = new ClientDataService(CurUser).exprotClientAllExcel(sList.rows.ToList(), colList);
return File(bytes, xlsxMimeType, $"客户信息合并表_{DateTime.Now:yyyyMMddHHmmss}.xlsx");
}
public JsonResult GetClientById(int? clientId)
{
var client = DataCacheProvider.GetClientDataSource().GetData(clientId ?? 0);
if (client == null)
{
return JsonError("没有客户信息");
}
return JsonSuccessData(client);
}
///
/// 获取客户状态
///
[HttpPost]
public JsonResult GetClientStatus(int? clientId)
{
var client = DataCacheProvider.GetClientDataSource().GetData(clientId ?? 0);
if (client == null)
{
return JsonSuccess("");
}
return JsonSuccessData(client?.ProcessStatus);
}
[MyAuthorize("结算管理-追加预付金报告")]
public ActionResult ClientPaymentList()
{
ViewBag.valueDate = EodOperationBase.GetLastSettlementDate(valuedateBLL.ValueDate).ToString("yyyy-MM-dd"); // valuedateBLL.ValueDate.ToString("yyyy-MM-dd");
return View();
}
///
///客户操作历史记录
///
public ActionResult ClientOperationHistory(int id)
{
var dates = clientDB.ClientAuditLog.Where(c => c.ClientId == id)
.Select(n => new ClientAuditLogDto
{
id = n.id,
OptType = n.OptType,
Changes = n.Changes,
DataType = n.DataType,
OptName = n.OptName,
OptDate = n.OptDate
})
.OrderByDescending(d => d.id).ToArray();
foreach (var a in dates)
{
if (!string.IsNullOrEmpty(a.Changes) && (a.OptType == "编辑客户" || a.OptType == "编辑客户人员" || a.OptType == "编辑银行卡"))
{
var changeList = JsonHelper.Deserialize>>(a.Changes);
if (changeList != null && changeList.Count > 0)
{
changeList = ClientDataChangeLogHandle.Handle(a.OptType, changeList);
a.Changes = changeList.ToJson();
}
}
a.Changes = (a.OptType == "编辑银行卡" || a.OptType == "编辑客户" || a.OptType == "编辑产品投资人" || a.OptType == "编辑客户人员" || a.OptType == "上传文件" || a.OptType == "修改上传文件" || a.OptType == "删除人员信息" || a.OptType == "销户" || a.OptType == "删除文件") ?
new DatatraceQueryService(CurUser).ReplaceDataChanges(new Client(), a.Changes) : "";
}
return View(dates);
}
///
///客户操作历史记录--历史评估记录
///
public ActionResult ClientAssessmentHistoryLog(int id)
{
var dates = clientDB.ClientAuditLog.Where(c => c.ClientId == id && c.OptType == "评估记录").OrderByDescending(d => d.id).ToList();
var list = new List();
if (dates != null && dates.Count > 0)
{
dates.ForEach(t =>
{
list.Add(JsonHelper.ToObject(t.Changes));
});
}
return View(list);
}
///
/// 查询客户信息
///
[HttpPost]
[MyAuthorize("客户管理-客户查看")]
public JsonResult ClientQuery(ClientReq req)
{
req.ValueDate = valuedateBLL.ValueDate;
req.CheckContactExpired = true;
req.CurUserClientIds = CurUser.GetClientIdsByCustomerManager();
var service = new ClientQueryService(CurUser);
var sList = service.SearchList(req);
var appropriatenessAssessors = RoleRight.GetSystemUserByFunction("担任适当性评估人");
var salesDic = new Lazy>(() =>
{
return yldb.salesmen.Select(n => new { n.id, n.Name }).ToDictionary(n => n.id, m => m.Name);
});
Dictionary> clientTagList = null;
if (sList != null && sList.rows != null && sList.rows.Any())
{
using var tagService = new TagService(CurUser);
clientTagList = tagService.GetTagByClientIds(sList.rows.Select(p => p.id).Distinct().ToList());
}
clientTagList ??= new Dictionary>();
foreach (var x in sList.rows)
{
if (AppHelper.UseFutureVersion("销售提成", "V2"))
{
if (!string.IsNullOrWhiteSpace(x.Seller))
{
var tempArray = x.Seller.Split(',');
var SalesmenNames = new List();
foreach (var item in tempArray)
{
if (int.TryParse(item, out var id) && id > 0
&& salesDic.Value.TryGetValue(id, out var name) && !string.IsNullOrWhiteSpace(name))
{
SalesmenNames.Add(name);
}
}
if (SalesmenNames != null && SalesmenNames.Any())
{
x.Seller = string.Join(",", SalesmenNames);
}
}
}
else if (!string.IsNullOrEmpty(x.Seller))
{
var tempArray = new List();
if (x.Seller.Contains(","))
{
tempArray = x.Seller.Split(',').Select(a => Convert.ToInt32(a)).ToList();
}
else
{
if (int.TryParse(x.Seller, out var a))
{
tempArray.Add(Convert.ToInt32(x.Seller));
}
}
if (tempArray.Any())
{
var salesmanNames = new SalesmenDataService(CurUser).GetSalesNamesByIds(tempArray).Select(o => o.Name);
if (salesmanNames.Any())
{
x.Seller = string.Join(",", salesmanNames);
}
}
}
if (x.SalesDepartmentId == null)
{
x.SalesDepartment = "";
}
else
{
var department = DepartmentsController.GetDepartmentById(x.SalesDepartmentId.Value);
x.SalesDepartment = department == null ? "" : department.Name;
}
x.AppropriatenessAssessorName = appropriatenessAssessors.Where(y => y.Id == x.AppropriatenessAssessor).FirstOrDefault() == null ? "" : appropriatenessAssessors.Where(y => y.Id == x.AppropriatenessAssessor).FirstOrDefault().Name;
if (!PS.Config.Is格林大华)
{
if (!string.IsNullOrEmpty(x.CustomerManagerId))
{
if (x.CustomerManagerId.Contains(","))
{
var managerNames = new List();
var CustomerManagerIds = x.CustomerManagerId.Split(',').ToList();
CustomerManagerIds.ForEach(a =>
{
var manager = UserBLL.GetById(Convert.ToInt32(a));
if (manager != null)
{
managerNames.Add(manager.Name);
}
});
x.CustomerManager = managerNames.Any() ? string.Join(",", managerNames) : string.Empty;
}
else
{
var manager = UserBLL.GetById(Convert.ToInt32(x.CustomerManagerId));
x.CustomerManager = manager == null ? "" : manager.Name;
}
}
}
var deadLine = ClientLinqExtendService.GetEvaluateDate(x.EvaluateDate, x.EvaluateOfValidity);
x.AssessmentExpired = deadLine.Date <= DateTime.Now.Date;
x.AssessmentExpiredWithinThreeDays = deadLine > DateTime.Now.Date && deadLine.Date <= DateTime.Now.Date.AddDays(30).Date;
x.AssessmentExpiredDate = deadLine.ToString("yyyy-MM-dd");
//var clientPath = $"{x.id}_{x.Name}";
//var filePath = Server.MapPath($"~/App_Docs/ClientFiles/{clientPath}");
//var fileSuitablyFilesPath = Server.MapPath($"~/App_Docs/ClientFiles/SuitablyFiles/{clientPath}");
//var fileNames = new List();
//if (Directory.Exists(filePath))
//{
// fileNames.AddRange(Directory.EnumerateFiles(filePath).Select(y => Path.GetFileName(y)).ToList());
//}
//if (Directory.Exists(fileSuitablyFilesPath))
//{
// fileNames.AddRange(Directory.EnumerateFiles(fileSuitablyFilesPath).Select(y => Path.GetFileName(y)).ToList());
//}
//暂时解决东吴生产问题(适当性评级需优化)
// if (PS.Config.Is东吴)
// {
// x.AppropriatenessDegree = x.AppropriatenessDegree + 1;
// }
x.HasDocuments = new ClientFileService(CurUser).hasDocments(x.id);
//拼装标签值
if (clientTagList.ContainsKey(x.id))
{
x.Tags = clientTagList[x.id];
x.OutputTags = TagService.GetOutputTagsStr(x.Tags);
}
}
return Json(sList);
}
///
/// 导出客户列表
///
[ResponseCache(NoStore = true)]
public ActionResult ClientListExport(ClientReq req)
{
var list = ((SearchListResult)ClientQuery(req).Value).rows;
var templateFilePath = Server.MapPath("~/App_Docs/导出模板/客户信息列表.xlsx");
var dicList = list.Select(n => ExpandoDictionary.ConvertObject(n, (pname, pvalue) =>
{
switch (pname)
{
case nameof(ClientLinq.IsIndustryConnectVariety): //行业标的相关
case nameof(ClientLinq.IsRealControl): //实际控制关系
case nameof(ClientLinq.IsEvaluate): //是否评估
case nameof(ClientLinq.IsRequireConversionTypes): //转化类型
case nameof(ClientLinq.IsAssessmentResultChange): //评估结果变动
case nameof(ClientLinq.IsTradeCredit): //期权费授信
case nameof(ClientLinq.PendingMarginCallPayment): //是否需要追保
return pvalue?.ToString() == "1" ? "是" : "否";
}
return pvalue?.ToString() ?? string.Empty;
}));
using var generator = Office.ExcelModule.ExcelGenerator.UseTemplateGenerator(templateFilePath).
AddVariable(new { list = dicList });
return File(generator.GenerateBytes(), "application/vnd.ms-excel", "客户信息列表_" + DateTime.Today.ToString("yyyy-MM-dd") + ".xlsx");
}
[HttpPost]
public JsonResult ClientBanlanceQuery(ClientReq req)
{
if (req.sidx != "Number")
{
req.sidx = null;
}
if (!req.ValueDate.HasValue)
{
req.ValueDate = valuedateBLL.ValueDate;
}
req.rows = 100000;
var curUser = CurUser;
req.CurUserClientIds = CurUser.GetClientIdsByCurUser(true);
var clientService = new ClientQueryService(curUser);
var predicate = clientService.CreatePredicate(req);
var clientList = clientService.GetClientListByWhere(predicate);
var task1 = Task.Run(() => clientService.SearchList(req, predicate));
var task2 = Task.Run(() =>
{
var clientIds = clientList.Select(O => O.id).ToList();
return ClientBalanceUtility.GetClientRiskMonitorForShanXiGuShou(clientIds, req.ValueDate.Value, req.MarginShownType);
});
Task.WaitAll(task1, task2);
var sList = task1.Result;
var banlanceList = task2.Result ?? Array.Empty();
//var sList = new ClientQueryService(curUser).SearchList(req, predicate);
//var clientIds = clientList.Select(O => O.id).ToList();
//var banlanceList = ClientBalanceUtility.GetClientRiskMonitor(clientIds, req.ValueDate.Value, req.MarginShownType) ?? Array.Empty();
//var creditExposureDict = new Dictionary();
//var ratioDict = new Dictionary();
var set = sList.rows.Select(n => n.id).ToHashSet();
var allList = banlanceList.Where(n => set.Add(n.ClientId)).Select(n => new ClientLinq { id = n.ClientId }).Concat(sList.rows).ToArray();
var banlanceDic = banlanceList.ToDictionary(n => n.ClientId);
var salesDic = new Lazy>(() =>
{
return yldb.salesmen.Select(n => new { n.id, n.Name }).ToDictionary(n => n.id, m => m.Name);
});
var RegisteredCapitalDict = new ClientMetaService(CurUser).GetMeta(req.CurUserClientIds, "RegisteredCapital");
//上市
var listedCorpDict = new ClientMetaService(CurUser).GetMeta(req.CurUserClientIds, "listedCorp");
//小微
var microCorpDict = new ClientMetaService(CurUser).GetMeta(req.CurUserClientIds, "microCorp");
Dictionary> clientTagList = null;
if (allList != null && allList.Any())
{
using var tagService = new TagService(CurUser);
clientTagList = tagService.GetTagByClientIds(allList.Select(p => p.id).Distinct().ToList());
}
clientTagList ??= new Dictionary>();
foreach (var x in allList)
{
if (!string.IsNullOrWhiteSpace(x.Seller))
{
var tempArray = x.Seller.Split(',');
var SalesmenNames = new List();
foreach (var item in tempArray)
{
if (int.TryParse(item, out var id) && id > 0
&& salesDic.Value.TryGetValue(id, out var name) && !string.IsNullOrWhiteSpace(name))
{
SalesmenNames.Add(name);
}
}
if (SalesmenNames != null && SalesmenNames.Any())
{
x.Seller = string.Join(",", SalesmenNames);
}
}
if (x.CustomerNature > 0)
{
x.CustomerNatureName = ((CustomerNatureEnum)x.CustomerNature.Value).ToString();
}
if (x.SalesDepartmentId == null)
{
x.SalesDepartment = string.Empty;
}
else
{
var department = DepartmentsController.GetDepartmentById(x.SalesDepartmentId.Value);
x.SalesDepartment = department?.Name ?? string.Empty;
}
banlanceDic.TryGetValue(x.id, out var clientBalance);
var client = DataCacheProvider.GetClientDataSource().GetData(x.id);
clientBalance ??= new ClientSettleBalance { ClientId = x.id };
x.TransactionPenNumber = clientBalance.TradeCount;
x.SellNominalPrincipalOfTransaction = clientBalance.SellNotionalPrincipal;
x.BuyNominalPrincipalOfTransaction = clientBalance.BuyNotionalPrincipal;
x.CurrentHoldingPenNumber = clientBalance.PositionCount;
x.HoldingDeposit = -clientBalance.PayableMargin;
x.HoldingDepositA = -clientBalance.PayableMarginA;
x.HoldingDepositB = -clientBalance.PayableMarginB;
x.SwapPayableMargin = -clientBalance.SwapPayableMargin;
x.AvailableAmount = clientBalance.AvailableAmount;
x.InsuredAmount = clientBalance.MarginByPayableMarginTotal;
x.MarginMonitoringTime = clientBalance.UpdateDate ?? DateTime.Now;
x.FreezePremium = clientBalance.FreezePremium;
x.ReceivablesPremium = clientBalance.ReceivablesPremium;
x.AdvisableMargin = clientBalance.AdvisableMargin;
x.MarginBalance = clientBalance.MarginBalance;
x.PotentialSurpluses = clientBalance.PotentialSurpluses;
x.TotalCredit = clientBalance.TotalCredit;
x.CreditUsed = clientBalance.CreditUsed;
x.OptionPremium = clientBalance.OptionPremium;
x.OptionPremiumSwap = clientBalance.OptionPremiumSwap;
x.SettlementBalance = clientBalance.SettlementBalance;
x.TodayNewMargin = clientBalance.TodayNewMargin;
x.GuaranteesTotalAmount = clientBalance.GuaranteesTotalAmount;
x.FreezingGuaranteesTotalAmount =
Math.Min(Math.Abs(Math.Min((x.AvailableAmount ?? 0) - (x.GuaranteesTotalAmount ?? 0), 0)), x.GuaranteesTotalAmount ?? 0);
x.AmountFund = clientBalance.AmountFund;
x.AmountFundWithProduct = clientBalance.AmountFundWithProduct;
x.TotalAmount = clientBalance.SwapMarketAmount;
x.RoundedTotalAmount = clientBalance.RoundedTotalAmount;
x.TotalTradeCount = clientBalance.TotalTradeCount;
x.BuyCount = clientBalance.BuyCount;
x.SellCount = clientBalance.SellCount;
x.TotalNotionalPrincipal = clientBalance.TotalNotionalPrincipal;
x.TodayNotionalPrincipal = clientBalance.TodayNotionalPrincipal;
x.PositionNotionalPrincipal = clientBalance.PositionNotionalPrincipal;
x.DaliyPnl = clientBalance.DaliyPnl;
x.RoundedDaliyPnl = clientBalance.RoundedDaliyPnl;
x.PositionPnl = clientBalance.PositionPnl;
x.RoundedPositionPnl = clientBalance.RoundedPositionPnl;
x.WinLoss = clientBalance.WinLoss;
x.PositionPremiumNetCash = clientBalance.PositionPremiumNetCash;
x.PositionPv = clientBalance.PositionPv;
x.RoundedPositionPv = clientBalance.RoundedPositionPv;
x.PrepaymentAmount = clientBalance.PrepaymentAmount;
x.FrozenMarginMoney = clientBalance.FrozenMarginMoney;
x.NetFund = clientBalance.NetFund;
x.NetFundAll = clientBalance.NetFundAll;
x.VmFundSum = clientBalance.VmFundSum;
x.OtherFund = clientBalance.OtherFund;
x.Coupon = clientBalance.Coupon;
x.SwapBalance = clientBalance.SwapBalance;
x.PayableMargin = clientBalance.PayableMargin;
x.TwoSideMargin = clientBalance.TwoSideMargin;
x.OtherSideMargin = -clientBalance.OtherSideMargin;
x.MySideMargin = clientBalance.MySideMargin;
x.DeltaMargin = -clientBalance.DeltaMargin;
x.IsPayableMarginManual = clientBalance?.IsPayableMarginManual;
x.AvailableAmount = clientBalance.AvailableAmount;
x.MarginByPayableMargin = clientBalance.MarginByPayableMargin;
x.ClosedTradePayableFund = clientBalance.ClosedTradePayableFund;
x.PositionTradePayableFund = clientBalance.PositionTradePayableFund;
x.PayableFund = clientBalance.PayableFund;
x.DesirableFund = clientBalance.DesirableFund;
x.CreditUsedValue = clientBalance.CreditUsed * clientBalance.TotalCredit;
x.BuyerPositionMargin = clientBalance.BuyerPositionMargin;
x.SellerPositionPremium = clientBalance.SellerPositionPremium;
x.ShouldCharged = x.BuyerPositionMargin + x.SellerPositionPremium;
x.AvailableStockEqvNotional = clientBalance.AvailableStockEqvNotional.Normalize();
x.PFE = clientBalance.PFE;
x.EndDesirableFund = x.NetFund + x.SettlementBalance + clientBalance.EndPremiumSum;
x.SwapMarketAmount= clientBalance.SwapMarketAmount;
x.SwapMarketAmountPercent=clientBalance.SwapMarketAmountPercent;
x.MaintenanceMargin=clientBalance.MaintenanceMargin;
x.NeedAddMargin=clientBalance.NeedAddMargin;
x.LastDayRemainFund=clientBalance.LastDayRemainFund;
if (clientBalance.MarginOccupation == 0)
{
x.WorstCastClientPayableRatio = 10000;
}
else
{
x.WorstCastClientPayableRatio = (x.MarginBalance / clientBalance.MarginOccupation) ?? 0;
}
x.clientEquity = (x.AmountFund + x.PositionPv) ?? 0;
x.licenseCodes = client.LicenseCode;
//是否小微
if (microCorpDict.ContainsKey(client.id))
{
x.IsSmallAndMicroEnterpriseas = microCorpDict.TryGetValue(client.id, out var microCorp) ? microCorp : "";
}
//是否上市
if (listedCorpDict.ContainsKey(client.id))
{
x.IsmicroCorp = listedCorpDict.TryGetValue(client.id, out var listedCorp) ? listedCorp : "";
}
x.LastDayPositionPremiumNetCashs = -(clientBalance.PositionPremiumNetCash); //GetMeta
if (RegisteredCapitalDict.ContainsKey(client.id))
{
x.NetFundSum = double.TryParse(RegisteredCapitalDict[client.id], out var registeredCapital) ? registeredCapital : registeredCapital;
}
x.availableNetFundSums = (clientBalance.PositionNotionalPrincipal / x.NetFundSum);
x.EAD = clientBalance.EAD;
var clientName = client?.Name ?? "";
x.MinimumTransferAmount = client?.MinimumTransferAmount;
x.LastHTSettlemetTime = clientBalance.LastHTSettlemetTime;
x.LastSettlemetTime = clientBalance.LastSettlemetTime;
x.InterestPnl = clientBalance.InterestPnl;
x.TradeFee = clientBalance.TradeFee;
//拼装标签值
if (clientTagList.ContainsKey(x.id))
{
x.Tags = clientTagList[x.id];
x.OutputTags = TagService.GetOutputTagsStr(x.Tags);
}
}
var sList2 = new SearchListResult();
//获取根据系统时间
var lastBalanceDate = EodOperationBase.GetLastSettlementDate(DateTime.Now.Date);
//系统交易日
var valuedate = valuedateBLL.ValueDate;
//获取根据系统时间
if (valuedate <= lastBalanceDate || yldb.eodStatus.FirstOrDefault(n => n.ValueDate == req.ValueDate)?.Status != "已收盘")
{
var clientIdsList = new List();
if (req.HaveMarginAmount || req.HavePayableFund || req.HavePosition || req.HaveClosedPayableFund || req.HaveTotalAsset)
{
if (req.HaveMarginAmount)
{
clientIdsList.AddRange(allList.Where(n => Math.Abs(n.InsuredAmount ?? 0) > 1e-4).Select(n => n.id).ToList());
}
if (req.HavePayableFund)
{
clientIdsList.AddRange(allList.Where(n => Math.Abs(n.PayableFund) > 1e-4).Select(n => n.id).ToList());
}
if (req.HavePosition)
{
clientIdsList.AddRange(yldb.intraday_trade_position.Where(n => n.ValueDate == req.ValueDate && n.TradeStatus == "确认成交").Distinct().Select(n => n.ClientId).ToList());
}
if (req.HaveClosedPayableFund)
{
clientIdsList.AddRange(allList.Where(n => Math.Abs(n.ClosedTradePayableFund) > 1e-4).Select(n => n.id).ToList());
}
if (req.HaveTotalAsset)
{
clientIdsList.AddRange(allList.Where(n => n.RoundedTotalAmount > 1).Select(n => n.id).ToList());
}
var allList2 = allList.Where(n => clientIdsList.Contains(n.id)).ToArray();
sList2.rows = sList.rows.Where(n => clientIdsList.Contains(n.id)).ToArray();
sList2.total = 1;
sList2.page = 1;
sList2.records = sList2.rows.Count();
sList2.Sum = SumHelper.CalculateSums(allList2);
return Json(sList2);
}
}
sList.Sum = SumHelper.CalculateSums(allList);
return Json(sList);
}
private Dictionary> GetClientBanlance(ClientReq req)
{
Dictionary> dict = null;
using (var dbContext = new YLContext())
{
var query = dbContext.ClientBalanceDaily.AsNoTracking().Where(daily => daily.BalanceDate >= req.StartDate && daily.BalanceDate <= req.ValueDate);
if (req.ClientIds != null && req.ClientIds.Any(n => n > 0))
{
query = query.Where(O => req.ClientIds.Contains(O.ClientId));
}
dict = query.AsEnumerable().GroupBy(O => O.ClientId).ToDictionary(K => K.Key, V => V.ToList());
}
return dict;
}
public ActionResult ClientBanlanceExport(ClientReq req)
{
object obj = null;
string targetFileName = null;
var sourceFileName = OtcAppContext.MapPath("~/App_Docs/导出模板/");
if (req.StartDate == null || req.StartDate == req.ValueDate)
{
var temp = Path.Combine(sourceFileName, $"资金监控模板1.xlsx");
sourceFileName = temp;
var searchList = ClientBanlanceQuery(req).Value as SearchListResult;
//模板绑定值,处理四舍五入配置
foreach (var c in searchList.rows)
{
if (PS.Config.IsPVRounded)
{
c.PositionPv = c.RoundedPositionPv;
c.PositionPnl = c.RoundedPositionPnl;
c.TotalAmount = c.RoundedTotalAmount;
c.DaliyPnl = c.RoundedDaliyPnl;
}
}
var pairs = searchList.Sum as Dictionary;
obj = new
{
TotalTradeCountSum = pairs["TotalTradeCountSum"],
TotalNotionalPrincipalSum = pairs["TotalNotionalPrincipalSum"],
TransactionPenNumberSum = pairs["TransactionPenNumberSum"],
TodayNotionalPrincipalSum = pairs["TodayNotionalPrincipalSum"],
PositionNotionalPrincipalSum = pairs["PositionNotionalPrincipalSum"],
CurrentHoldingPenNumberSum = pairs["CurrentHoldingPenNumberSum"],
WinLossSum = pairs["WinLossSum"],
PositionPvSum = PS.Config.IsPVRounded ? pairs["RoundedPositionPvSum"] : pairs["PositionPvSum"],
PositionPnlSum = PS.Config.IsPVRounded ? pairs["RoundedPositionPnlSum"] : pairs["PositionPnlSum"],
LastDayRemainFundSum = pairs["LastDayRemainFundSum"],
NetFundSum = pairs["NetFundSum"],
NetFundAllSum = pairs["NetFundAllSum"],
OtherFundSum = pairs["OtherFundSum"],
AmountFundSum = pairs["AmountFundSum"],
AvailableAmountSum = pairs["AvailableAmountSum"],
InsuredAmountSum = pairs["InsuredAmountSum"],
DesirableFundSum = pairs["DesirableFundSum"],
MySideMarginSum = pairs["MySideMarginSum"],
VmFundSumSum = pairs["VmFundSumSum"],
MaintenanceMarginSum = pairs["MaintenanceMarginSum"],
SwapMarketAmountSum = pairs["SwapMarketAmountSum"],
InterestPnlSum=pairs["InterestPnlSum"],
TradeFeeSum=pairs["TradeFeeSum"],
InfoList = searchList.rows
};
targetFileName = $"资金监控_{req.ValueDate:yyyyMMdd}.xlsx";
}
else
{
sourceFileName = Path.Combine(sourceFileName, "资金监控模板2.xlsx");
var startDate = req.StartDate;
req.StartDate = valuedateBLL.GetNonHolidayDefore(req.StartDate.Value.AddDays(-1));
req.CurUserClientIds = CurUser.GetClientIdsByCurUser(CurUser.交易管理_查看所有交易);
var sList = new ClientQueryService(CurUser).SearchList(req);
req.ClientIds = sList.rows.Select(O => O.id).ToList();
var dict = GetClientBanlance(req);
var objs = new List