收益互换月报改成从报送系统读取数据

This commit is contained in:
吴方海
2025-09-09 13:07:21 +08:00
parent 0643cafabf
commit f3df6448fb
6 changed files with 139 additions and 207 deletions
+1 -1
View File
@@ -78,7 +78,7 @@ namespace YLErp
setEnvironment(new[] { "KafkaConfig" }, "_");
setEnvironment(new[] { "BondOmsInterface" }, "_");
setEnvironment(new[] { "OrcaleDatabaseConfig" }, "_");
Environment.SetEnvironmentVariable("MaxThreadPercent", configuration["MaxThreadPercent"]);
Environment.SetEnvironmentVariable("Reg_Report_Url", configuration["Reg_Report_Url"]);
//用于必须引入程序集System.Numerics.Vectors
_ = System.Numerics.Vector<double>.Zero;
@@ -9,6 +9,7 @@ using System.Threading.Tasks;
using YLErp.DBModels;
using YLErp.DBModels.Consts;
using YLErp.DBModels.Enums;
using YLErp.Helpers;
using YLErp.Model;
using YLErp.Modules.SuperviseReportModule.ExtendReport.ZheQi;
@@ -21,138 +22,51 @@ namespace YLErp.Modules.SuperviseReportModule.ExtendReport.ZheShang
}
public override string TemplateName => "月报基础数据债券收益互换.xlsx";
public override string TargetFileName => "月报基础数据债券收益互换"+ base.RequestInfo.ValueDate.ToString("yyyyMM") +".xlsx";
public override string[] SheetNames => new[] { "本月末存量业务明细" };
public override object SearchReportInfo(string sheetName)
public override Dictionary<string, object> SearchReportInfo()
{
var yearMonth = RequestInfo.ValueDate.ToString("yyyyMM");
var dealList = new List<SwapTradeMothReportModel>();
var predicate = PredicateBuilder.Create<eod_swap_position>(n => !n.Invalid && n.PosiQuantity > 0);
var tradePredicate = PredicateBuilder.Create<trade>(n => n.TradeType=="收益互换"
&& n.ValidState != "InValid");
// 获取当月最后一次日期
var currentMonth = new DateTime(base.RequestInfo.ValueDate.Year, base.RequestInfo.ValueDate.Month, 1);
var nextMonth = currentMonth.AddMonths(1);
var valueDate = DbContext.eodStatus
.Where(t => t.Status == "已收盘" && t.ValueDate >= currentMonth && t.ValueDate < nextMonth)
.OrderByDescending(t => t.ValueDate)
.Select(t => t.ValueDate)
.FirstOrDefault();
// 如果没有找到当月的收盘日期,则使用请求中的日期
if (valueDate == default(DateTime))
var addList= new List<SwapTradeMothReportModel>();
var reportData = GetSwapMonthReport(yearMonth);
if (reportData != null)
{
valueDate = base.RequestInfo.ValueDate;
}
predicate = predicate.And(x => x.ValueDate == valueDate);
tradePredicate = tradePredicate.And(x => valueDate >= x.StartDate);
var positionQuery = DbContext.eod_swap_position.Where(predicate);
var tradeQuery = DbContext.trade.Where(tradePredicate);
var query = from position in positionQuery
join td in tradeQuery on position.SwapTradeId equals td.id
join tcrConfirm in DbContext.trade_contract_r.Where(O => O.Type == ContractTypeEnum.Trade && O.IsValid) on td.id equals tcrConfirm.TradeId into tcrConfirms
from tcrConfirm in tcrConfirms.DefaultIfEmpty()
select new EodSwapPositionResponse
{
position = position,
ClientName = td.ClientName,
ConfrimNo = tcrConfirm.ContractCode,
TradeNumber = td.TradeNumber,
StructureType = td.StructureType,
UnwindDate = td.UnWindDate,
TradeStatus = td.TradeStatus
};
var list= query.ToList();
var eodSwapList= DbContext.eod_swap.Where(s=>s.ValueDate==valueDate).AsNoTracking().ToList();
foreach (var item in list)
{
var obj = new SwapTradeMothReportModel();
// 获取标的名称
string underlyingName = "";
if (!string.IsNullOrEmpty(item.position?.UnderlyingCode))
if (reportData.DealList != null && reportData.DealList.Count > 0)
{
var underlying = DbContext.underlying_manager.FirstOrDefault(s => s.UnderlyingCode == item.position.UnderlyingCode);
underlyingName = underlying?.UnderlyingName ?? "";
dealList = reportData.DealList;
}
// 填充 SwapTradeMothReportModel 对象
obj.NameOfSecuritiesCompany = ""; // 报送机构名称
obj.NameOfCounterparty = item.ClientName; // 交易对手方名称
obj.NameOfCounterpartyProduct = ""; // 交易对手产品名称,如果有需要从其他地方获取
obj.TransactionConfirmationNumber = item.ConfrimNo; // 交易确认书编号
var eodSwap= eodSwapList.FirstOrDefault(s => s.SwapTradeId == item.position.SwapTradeId);
// 名义本金/多头名义本金和空头名义本金
obj.NotionalPrincipalAmountL = eodSwap.NotionalValueLong;
obj.SNotionalPrincipalAmount = eodSwap.NotionalValueShort;
/**
* 校验规则:
当选择“场外期权”时,“期权费(非年化)”、“期权标的小类(场外期权填写)” 和“期权类型” 三项必填;
当选择“收益互换”类型时,“收益互换标的小类(收益互换填写)”必填
11:收益互换(客户多头)
12:收益互换(客户空头)
13:多空组合收益互换
14:其他收益互换
02:场外期权
*/
obj.BusinessType = obj.NotionalPrincipalAmountL>0? "11":"12";
obj.LongPositionContractValue = obj.NotionalPrincipalAmountL > 0? eodSwap.PostionValue:0;
obj.ShortPositionContractValue = obj.SNotionalPrincipalAmount > 0 ? eodSwap.PostionValue:0;
// 设置维持保证金比例
var maitainMargin = eodSwap.PostionMarginGain+ eodSwap.PostionMarginLoss;
var MaitainMarginRation= eodSwap.NotionalValue==0?0: maitainMargin / eodSwap.NotionalValue;
obj.MaitainMarginRation =Math.Round(MaitainMarginRation*100,2,MidpointRounding.AwayFromZero).ToString()+"%";
if (item.position != null)
if (reportData.AddList != null && reportData.AddList.Count > 0)
{
// 设置起始日和到期日
obj.StartDay = item.position.PosiStartDate.ToString("yyyy-MM-dd");
obj.DueDate = item.position.PosiMatuirityDate.Value.ToString("yyyy-MM-dd");
// 设置标的信息
obj.UndrlygAssetCode = item.position.UnderlyingCode;
obj.UndrlygAssetName = underlyingName; // 使用前面获取的标的名称
/**
* 0:权益类
1:大宗商品
2:利率
3:信用类
4:汇率
5:混合类
99:其他
说明:对于多类别资产组合,单一资产类别占比大于等于80%的,分类为该类别,各资产类别占比均小于80%的,为混合类
*/
obj.SumInvestmentTargetType = "2"; // 标的类型,可能需要根据实际情况调整
obj.UndrlygAssetTradgPlc = ""; // 标的交易场所,可能需要根据实际情况调整
/**
* 校验规则:当“业务类型”为“收益互换”时,必填
0:股票
1:股指
2:北交所/新三板挂牌股票
3:香港股票
4:香港股指
5:基金及基金专户
6:债券
7:黄金期货
8:国债期货
9:股指期货
10:其他期货
11:黄金现货
12:其他现货
13:境外期货
14:境外现货
15:境外股票
16:境外股指
17:汇率
18:利率
99:其他标的
*/
obj.ExchangeSumInvestmentTargetType = "6"; // 收益互换标的小类
addList = reportData.AddList;
}
dealList.Add(obj);
}
return new
{
DataDate = RequestInfo.ValueDate.ToString("yyyy-MM"),
DealList = dealList
return new Dictionary<string, object>() {
{"本月新增业务明细", addList},
{"本月末存量业务明细", dealList}
};
}
private SwapTradeMothReportModelList GetSwapMonthReport(string yearMonth)
{
var baseUrl = Environment.GetEnvironmentVariable("Reg_Report_Url");
var calculateUrl = "/calc/cal_bond_value";
SwapTradeMothReportModelListRequest request = new SwapTradeMothReportModelListRequest()
{
YearMonth= yearMonth
};
if (!string.IsNullOrEmpty(baseUrl))
{
var httpHelper = new HttpHelper(baseUrl, null);
var result = httpHelper.PostRequestNoAuth<SwapTradeMothReportModelListRequest, SwapTradeMothReportModelListReponse>(calculateUrl, request).Result;
if (result != null && !result.success)
{
LogFactory.GetLogger("SwapTradeMothReport").Info("获取收益互换月报信息失败:" + result.message);
}
else
{
return result.data;
}
}
return null;
}
}
}
@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using YLErp.Models;
namespace YLErp.Modules.SuperviseReportModule.ExtendReport.ZheShang
{
@@ -113,4 +114,19 @@ namespace YLErp.Modules.SuperviseReportModule.ExtendReport.ZheShang
/// </summary>
public decimal ShortPositionContractValue { get; set; }
}
public class SwapTradeMothReportModelListRequest
{
public string YearMonth { get; set; }
}
public class SwapTradeMothReportModelListReponse : ApiResponse
{
public SwapTradeMothReportModelList data { get; set; }
}
public class SwapTradeMothReportModelList
{
public List<SwapTradeMothReportModel> DealList { get; set; }
public List<SwapTradeMothReportModel> AddList { get; set; }
}
}
+2 -1
View File
@@ -65,9 +65,10 @@
"YiLian_SwapFlowGroup": "YiLian_SwapFlowGroup" //交易端同步流水消费组
},
"BondOmsInterface": {
"BaseUrl": "http://localhost:8887",
"BaseUrl": "http://192.168.2.96:10023/trs_hub_api",
"CalculateMarginUrl": "/marginAlgorithm/triggerMarginCalc" //
},
"Reg_Report_Url": "http://192.168.2.96:10019",
"OrcaleDatabaseConfig": {
"Schema": "APEX_040000"
},
+83 -82
View File
@@ -1,85 +1,86 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"ylcms": "server=139.196.109.225;uid=root;pooling=true;port=3306;pwd=Midnight001!@#$;database=yltrs_ylcms;charset=utf8;Allow User Variables=True;SslMode=none;Connection Timeout=30;IgnoreCommandTransaction=true;",
"yladmin": "server=139.196.109.225;uid=root;pooling=true;port=3306;pwd=Midnight001!@#$;database=yltrs_admin;charset=utf8;Allow User Variables=True;SslMode=none;Connection Timeout=30;IgnoreCommandTransaction=true;",
"ylclient": "server=139.196.109.225;uid=root;pooling=true;port=3306;pwd=Midnight001!@#$;database=yltrs_client;charset=utf8;Allow User Variables=True;SslMode=none;Connection Timeout=30;IgnoreCommandTransaction=true;",
"bondoms": "server=139.196.109.225;uid=root;pooling=true;port=3306;pwd=Midnight001!@#$;database=bond_oms;charset=utf8;Allow User Variables=True;SslMode=none;Connection Timeout=30;IgnoreCommandTransaction=true;"
// "apex_oracle": "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=122.112.205.57)(PORT=11521)))(CONNECT_DATA=(SERVICE_NAME=xe)));User ID=system;Password=oracle;"
},
"AppSettings": {
"VirtualPathRoot": "",
"UseRightAligned": "",
"PluginFolder": "D:\\project\\zsza-trs\\Plugins\\build\\ZheShang\\Debug\\net6.0"
},
"LibreOffice": {
"ExePath": "",
"UserInstallation": ""
},
"EPPlus": {
"ExcelPackage": {
"LicenseContext": "NonCommercial" //The license context used
}
},
"KafkaConfig": {
"BootstrapServers": "139.196.109.225:9092", // Kafka 集群的地址
"Acks": -1, // 消息确认方式,可以是 All(-1)、Leader(1)、None(0) 中的一种
"EnableAutoCommit": false, //是否自动提交
"EnableIdempotence": false, // 开启幂等性,确保消息只被发送一次
"MaxInFlight": 5, // 控制生产者在同一时间最多可以发送的未确认消息数
"CompressionType": 0, // 消息压缩方式,可以是 None(0)、Gzip(1)、Snappy(2)、Lz4(3)、Zstd(4) 中的一种,
"MessageTimeoutMs": 3000, // 控制生产者等待消息确认的时间,单位是毫秒
"ClientRateTopic": "ylClientRateTopic", //客户互换费率生产topic
"HedgingAccountTopic": "ylHedgingAccountTopic", //对冲账户生产topic
"AccountCapitalTopicGroupId": "YiLian_OnRspAccountCapitalConsumer", //账户资金消费组
"ReqAccountCapitalTopic": "ReqAccountCapital", //账户资金请求topic
"OnRspAccountCapitalTopic": "OnRspAccountCapital", //账户资金请求返回topic
"AutoOffsetReset": 1, //Latest(0),Earliest(1),Error(2)
"EnableCalcBongd": false, //是否启用kafka计算
"ReqClientRiskCheckTopic": "YiLian_ReqClientRiskCheck", //客户风控检查
"ReqClientRiskCheckConsumerTopic": "YiLian_OnRspClientRiskCheck", //客户风控检查消费者
"ReqClientRiskCheckTopicGroupId": "YiLian_ReqClientRiskCheckConsumer1", //客户风控检查消费者
"ReqClientMonitorTopic": "YiLian_ReqClientMonitor", //客户资金监控
"OnRspClientMonitorConsumerTopic": "YiLian_OnRspClientMonitor", //客户资金监控消费者
"ReqClientMonitorTopicGroupId": "YiLian_ReqClientMonitorConsumer1", //客户资金监控消费组
"ReqClientMonitorSingleTopic": "YiLian_ReqClientMonitorSingle", //单个客户资金监控
"OnRspClientMonitorSingleConsumerTopic": "YiLian_OnRspClientMonitorSingle", //单个客户资金监控
"ReqClientMonitorSingleTopicGroupId": "YiLian_ReqClientMonitorSingleConsumer1", //单个客户资金监控
"TrsExchangeTradeConsumerTopic": "YiLian_HedgingOrder", //TRS对冲交易消费 topic
"TrsExchangeTradeConsumerTopicGroupId": "YiLian_HedgingOrderGroup1", //TRS对冲交易消费 Group
"YiLian_ReqHedgingOrderCancelTopic": "YiLian_ReqHedgingOrderCancel", //TRS对冲交易撤单请求消费 topic
"YiLian_ReqHedgingOrderCancelTopicGroupId": "YiLian_ReqHedgingOrderCancelGroup1", //TRS对冲交易撤单请求消费 Group
"YiLian_RespHedgingOrderCancelTopic": "YiLian_RespHedgingOrderCancel", //TRS对冲交易撤单请求回应 topic
"YiLian_ClientInfoChangeTopic": "YiLian_ClientInfoChangeTopic", //客户信息变更通知客户端 topic
"YiLian_CashCalcConsumerTopic": "YiLian_CashCalc", //客户资金计算 topic
"YiLian_CashCalcConsumerGroup": "YiLian_CashCalcGroup1", //客户资金计算消费组 topic
"YiLian_CashNoticeConsumerTopic": "YiLian_CashNotice", //客户资金通知 topic
"YiLian_CashNoticeConsumerGroup": "YiLian_CashNoticeGroup", //客户资金通知消费组 topic
"YiLian_HolidayResetTopic": "YiLian_HolidayReset", //交易日历缓存重新加载 topic
"YiLian_HolidayResetGroupId": "YiLian_HedgingOrderGroup1", //交易日历缓存重新加载消费 Group
"YiLian_SwapFlowTopic": "YiLian_SwapFlow", //交易端同步流水
"YiLian_SwapFlowGroup": "YiLian_SwapFlowGroup1", //交易端同步流水消费组
"YiLian_SysUserInfoChangeTopic": "YiLian_SysUserInfoChangeTopic" //管理端系统用户变更
},
"BondOmsInterface": {
"BaseUrl": "http://trs.yiliantech.com:8080/trs_hub_api"
},
"OrcaleDatabaseConfig": {
"Schema": "APEX_040000"
},
"SendKafakaCron": "10 0 * * *",
"MaxThreadPercent": 0.6, //占系统资源最多60%的线程数量
"oa_confg": {
"BaseUrl": "http://ip:port",
"SystemKey": "M001", //OA系统key
"ObjectClass": "ZSZQ_ZDNX", //OA文件类别
"Urgent": 1, //紧急程度,1一般 2紧急 3加急
"Issend": 0 //流程是否自动发送,0不发送,1自动发送下一步
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"ylcms": "server=139.196.109.225;uid=root;pooling=true;port=3306;pwd=Midnight001!@#$;database=yltrs_ylcms;charset=utf8;Allow User Variables=True;SslMode=none;Connection Timeout=30;IgnoreCommandTransaction=true;",
"yladmin": "server=139.196.109.225;uid=root;pooling=true;port=3306;pwd=Midnight001!@#$;database=yltrs_admin;charset=utf8;Allow User Variables=True;SslMode=none;Connection Timeout=30;IgnoreCommandTransaction=true;",
"ylclient": "server=139.196.109.225;uid=root;pooling=true;port=3306;pwd=Midnight001!@#$;database=yltrs_client;charset=utf8;Allow User Variables=True;SslMode=none;Connection Timeout=30;IgnoreCommandTransaction=true;",
"bondoms": "server=139.196.109.225;uid=root;pooling=true;port=3306;pwd=Midnight001!@#$;database=bond_oms;charset=utf8;Allow User Variables=True;SslMode=none;Connection Timeout=30;IgnoreCommandTransaction=true;"
// "apex_oracle": "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=122.112.205.57)(PORT=11521)))(CONNECT_DATA=(SERVICE_NAME=xe)));User ID=system;Password=oracle;"
},
"AppSettings": {
"VirtualPathRoot": "",
"UseRightAligned": "",
"PluginFolder": "D:\\project\\zsza-trs\\Plugins\\build\\ZheShang\\Debug\\net6.0"
},
"LibreOffice": {
"ExePath": "",
"UserInstallation": ""
},
"EPPlus": {
"ExcelPackage": {
"LicenseContext": "NonCommercial" //The license context used
}
},
"KafkaConfig": {
"BootstrapServers": "139.196.109.225:9092", // Kafka 集群的地址
"Acks": -1, // 消息确认方式,可以是 All(-1)、Leader(1)、None(0) 中的一种
"EnableAutoCommit": false, //是否自动提交
"EnableIdempotence": false, // 开启幂等性,确保消息只被发送一次
"MaxInFlight": 5, // 控制生产者在同一时间最多可以发送的未确认消息数
"CompressionType": 0, // 消息压缩方式,可以是 None(0)、Gzip(1)、Snappy(2)、Lz4(3)、Zstd(4) 中的一种,
"MessageTimeoutMs": 3000, // 控制生产者等待消息确认的时间,单位是毫秒
"ClientRateTopic": "ylClientRateTopic", //客户互换费率生产topic
"HedgingAccountTopic": "ylHedgingAccountTopic", //对冲账户生产topic
"AccountCapitalTopicGroupId": "YiLian_OnRspAccountCapitalConsumer", //账户资金消费组
"ReqAccountCapitalTopic": "ReqAccountCapital", //账户资金请求topic
"OnRspAccountCapitalTopic": "OnRspAccountCapital", //账户资金请求返回topic
"AutoOffsetReset": 1, //Latest(0),Earliest(1),Error(2)
"EnableCalcBongd": false, //是否启用kafka计算
"ReqClientRiskCheckTopic": "YiLian_ReqClientRiskCheck", //客户风控检查
"ReqClientRiskCheckConsumerTopic": "YiLian_OnRspClientRiskCheck", //客户风控检查消费者
"ReqClientRiskCheckTopicGroupId": "YiLian_ReqClientRiskCheckConsumer1", //客户风控检查消费者
"ReqClientMonitorTopic": "YiLian_ReqClientMonitor", //客户资金监控
"OnRspClientMonitorConsumerTopic": "YiLian_OnRspClientMonitor", //客户资金监控消费者
"ReqClientMonitorTopicGroupId": "YiLian_ReqClientMonitorConsumer1", //客户资金监控消费组
"ReqClientMonitorSingleTopic": "YiLian_ReqClientMonitorSingle", //单个客户资金监控
"OnRspClientMonitorSingleConsumerTopic": "YiLian_OnRspClientMonitorSingle", //单个客户资金监控
"ReqClientMonitorSingleTopicGroupId": "YiLian_ReqClientMonitorSingleConsumer1", //单个客户资金监控
"TrsExchangeTradeConsumerTopic": "YiLian_HedgingOrder", //TRS对冲交易消费 topic
"TrsExchangeTradeConsumerTopicGroupId": "YiLian_HedgingOrderGroup1", //TRS对冲交易消费 Group
"YiLian_ReqHedgingOrderCancelTopic": "YiLian_ReqHedgingOrderCancel", //TRS对冲交易撤单请求消费 topic
"YiLian_ReqHedgingOrderCancelTopicGroupId": "YiLian_ReqHedgingOrderCancelGroup1", //TRS对冲交易撤单请求消费 Group
"YiLian_RespHedgingOrderCancelTopic": "YiLian_RespHedgingOrderCancel", //TRS对冲交易撤单请求回应 topic
"YiLian_ClientInfoChangeTopic": "YiLian_ClientInfoChangeTopic", //客户信息变更通知客户端 topic
"YiLian_CashCalcConsumerTopic": "YiLian_CashCalc", //客户资金计算 topic
"YiLian_CashCalcConsumerGroup": "YiLian_CashCalcGroup1", //客户资金计算消费组 topic
"YiLian_CashNoticeConsumerTopic": "YiLian_CashNotice", //客户资金通知 topic
"YiLian_CashNoticeConsumerGroup": "YiLian_CashNoticeGroup", //客户资金通知消费组 topic
"YiLian_HolidayResetTopic": "YiLian_HolidayReset", //交易日历缓存重新加载 topic
"YiLian_HolidayResetGroupId": "YiLian_HedgingOrderGroup1", //交易日历缓存重新加载消费 Group
"YiLian_SwapFlowTopic": "YiLian_SwapFlow", //交易端同步流水
"YiLian_SwapFlowGroup": "YiLian_SwapFlowGroup1", //交易端同步流水消费组
"YiLian_SysUserInfoChangeTopic": "YiLian_SysUserInfoChangeTopic" //管理端系统用户变更
},
"BondOmsInterface": {
"BaseUrl": "http://trs.yiliantech.com:8080/trs_hub_api"
},
"Reg_Report_Url": "http://139.196.109.225:8889",
"OrcaleDatabaseConfig": {
"Schema": "APEX_040000"
},
"SendKafakaCron": "10 0 * * *",
"MaxThreadPercent": 0.6, //占系统资源最多60%的线程数量
"oa_confg": {
"BaseUrl": "http://ip:port",
"SystemKey": "M001", //OA系统key
"ObjectClass": "ZSZQ_ZDNX", //OA文件类别
"Urgent": 1, //紧急程度,1一般 2紧急 3加急
"Issend": 0 //流程是否自动发送,0不发送,1自动发送下一步
}
}