OA对接功能中 增加SubUrl

This commit is contained in:
嬴政 时
2025-09-29 17:47:52 +08:00
parent 7e16aee43d
commit a4dcaf584e
5 changed files with 56 additions and 35 deletions
+36 -33
View File
@@ -37,19 +37,19 @@ namespace YLErp.Modules.TradeModule
try
{
// 获取交易信息
var trade = DbContext.trade.FirstOrDefault(x=>x.id==tradeId);
var trade = DbContext.trade.FirstOrDefault(x => x.id == tradeId);
if (trade == null)
{
return new TradeOAResult {TradeId=tradeId, Success = false, Message = "未找到交易信息" };
return new TradeOAResult { TradeId = tradeId, Success = false, Message = "未找到交易信息" };
}
// 获取交易确认书信息
var tcr = DbContext.trade_contract_r.Where(t => t.Type == ContractTypeEnum.Trade && t.IsValid&&t.TradeId==tradeId)
var tcr = DbContext.trade_contract_r.Where(t => t.Type == ContractTypeEnum.Trade && t.IsValid && t.TradeId == tradeId)
.FirstOrDefault();
trade_contract_document tdoc = null;
if (tcr!=null)
if (tcr != null)
{
tdoc = DbContext.trade_contract_document.Where(t => t.Code == tcr.ContractCode&&t.Type==tcr.Type).FirstOrDefault();
tdoc = DbContext.trade_contract_document.Where(t => t.Code == tcr.ContractCode && t.Type == tcr.Type).FirstOrDefault();
}
// 将之前的OA记录设置为无效
@@ -60,7 +60,7 @@ namespace YLErp.Modules.TradeModule
existingResult.SetOpt(UserInfo);
}
// 创建OA结果记录
var oaResult = new trade_contract_oa_result
{
@@ -72,10 +72,10 @@ namespace YLErp.Modules.TradeModule
oaResult.SetOpt(UserInfo);
DbContext.tradeContractOaResult.Add(oaResult);
await DbContext.SaveChangesAsync();
// 调用OA接口
var oaResp = await CallOAInterfaceAsync(trade, tcr?.ContractCode, tdoc, oaResult.id);
if (oaResp != null&& oaResp.success)
if (oaResp != null && oaResp.success)
{
oaResult.status = "提交成功";
oaResult.oa_fileid = oaResp.data?.fileid;
@@ -88,8 +88,8 @@ namespace YLErp.Modules.TradeModule
oaResult.oa_msg = oaResp?.message ?? "OA接口调用失败";
}
await DbContext.SaveChangesAsync();
return new TradeOAResult { TradeId = tradeId, Success = oaResult.status== "提交成功", Message = oaResult.oa_msg };
return new TradeOAResult { TradeId = tradeId, Success = oaResult.status == "提交成功", Message = oaResult.oa_msg };
}
catch (Exception ex)
{
@@ -113,10 +113,12 @@ namespace YLErp.Modules.TradeModule
// 获取OA配置
var oaConfigSection = AppManager.GetConfiguration().GetSection("oa_confg");
var baseUrl = oaConfigSection["BaseUrl"];
var subUrl = oaConfigSection["SubUrl"];
var loginName = string.Empty;
using (var adminDb = new ErpBaseContext()) {
var userInfo=adminDb.SystemUsers.FirstOrDefault(x=>x.Id==UserInfo.UserId);
loginName= userInfo?.OaAccount;
using (var adminDb = new ErpBaseContext())
{
var userInfo = adminDb.SystemUsers.FirstOrDefault(x => x.Id == UserInfo.UserId);
loginName = userInfo?.OaAccount;
}
var systemKey = oaConfigSection["SystemKey"];
var objectClass = oaConfigSection["ObjectClass"];
@@ -146,21 +148,21 @@ namespace YLErp.Modules.TradeModule
var fileBytes = await File.ReadAllBytesAsync(tdoc.AbsolutePath);
var base64Content = Convert.ToBase64String(fileBytes);
var fileName = Path.GetFileName(tdoc.AbsolutePath);
attachments.Add(new
{
nrtitle = fileName,
nrtype= "1",
nrtype = "1",
content = base64Content
});
logger.Info($"成功读取附件文件:{tdoc.AbsolutePath},文件大小:{fileBytes.Length} 字节");
}
else
{
logger.Error($"附件文件不存在:{tdoc.AbsolutePath}");
return new OAResponse() { data = null, success = false, message = $"附件文件不存在" };
}
}
catch (Exception ex)
@@ -178,36 +180,37 @@ namespace YLErp.Modules.TradeModule
var currentPositionType = currentPosition.PositionType;
// 2. 查询同一客户、同一交易日期的所有有效交易
var sameClientTrades = DbContext.trade.AsNoTracking()
.Where(t => t.ClientId == trade.ClientId
&& t.TradeDate == trade.TradeDate
.Where(t => t.ClientId == trade.ClientId
&& t.TradeDate == trade.TradeDate
&& t.ValidState != "InValid");
var exerciseDate = sameClientTrades.Select(x => x.ExerciseDate).OrderBy(o => o).FirstOrDefault();
// 3. 关联持仓表,筛选相同多空方向的持仓
var matchingPositions = from t in sameClientTrades
join sp in DbContext.swap_position.AsNoTracking()
on t.id equals sp.SwapTradeId
where sp.PositionType == currentPositionType
&& sp.IsInitial && sp.PositionType > 0 && !sp.Invalid
select t;
join sp in DbContext.swap_position.AsNoTracking()
on t.id equals sp.SwapTradeId
where sp.PositionType == currentPositionType
&& sp.IsInitial && sp.PositionType > 0 && !sp.Invalid
select t;
// 4. 计算名义本金汇总和加权平均保证金率
var totalNotionalPrincipal = matchingPositions.Sum(x => x.OriginalStockEqvNotional);
// 计算加权平均保证金率
decimal marginRate = 0;
if (totalNotionalPrincipal > 0)
{
decimal weightedMarginSum = 0;
foreach (var t in matchingPositions) {
foreach (var t in matchingPositions)
{
var marginDetail = UnderlyingHelper.GetApplicableMarginRate(t.ClientId, t.UnderlyingCode, t.TradeDate.Value);
var rate = marginDetail?.init_rate ?? 0;
weightedMarginSum += rate*Convert.ToDecimal(t.OriginalStockEqvNotional);
weightedMarginSum += rate * Convert.ToDecimal(t.OriginalStockEqvNotional);
}
marginRate = weightedMarginSum / Convert.ToDecimal(totalNotionalPrincipal);
// marginRate=Math.Round(marginRate, 4); // 保留四位小数
// marginRate=Math.Round(marginRate, 4); // 保留四位小数
}
var posiTypeStr = currentPositionType == (int)PositionTypeFlag.Long ? "买入" : "卖出";
var underlyingType = sameClientTrades.Count() > 0 ? "利率债" : trade.UnderlyingInstrumentTypeCn;
string bgContent = @$"<p>各位领导:</p>
@@ -220,7 +223,7 @@ namespace YLErp.Modules.TradeModule
<p style=""margin-left: 95px;"">&nbsp;{exerciseDate?.ToString("yyyy/M/d")}</p>
<p style=""margin-left: 48px;"">&nbsp;{totalNotionalPrincipal:N0}</p>
<p style=""margin-left: 48px;"">&nbsp;{trade.ClientName}</p>
<p>{(marginRate*100).ToString("0.##")}%线</p>";
<p>{(marginRate * 100).ToString("0.##")}%线</p>";
// 构建OA请求参数
var oaRequest = new
{
@@ -246,8 +249,8 @@ namespace YLErp.Modules.TradeModule
CKDX1 = "",
CKDX2 = "",
LB = "",
JYLX="2",//自主对冲
YWLX ="4",//收益互换
JYLX = "2",//自主对冲
YWLX = "4",//收益互换
QSBGNR = bgContent,
MX = new object[0],
SQMX = new object[0]
@@ -258,7 +261,7 @@ namespace YLErp.Modules.TradeModule
logger.Info($"OA接口参数:{JsonHelper.Serialize(oaRequest)}");
// 调用OA接口
var httpClient = new HttpClientWrap(baseUrl);
var response = httpClient.PostJson("/ZSZQ/fileDraft", oaRequest, null);// fileDraft
var response = httpClient.PostJson(subUrl, oaRequest, null);// fileDraft
logger.Info($"OA接口返回:{response}");
// 解析响应
var responseObj = JsonHelper.Deserialize<OAResponse>(response);
+9 -1
View File
@@ -73,5 +73,13 @@
"Schema": "APEX_040000"
},
"SendKafakaCron": "10 0 * * *",
"MaxThreadPercent": 0.6 //占系统资源最多60%的线程数量
"MaxThreadPercent": 0.6, //占系统资源最多60%的线程数量
"oa_confg": {
"BaseUrl": "http://10.52.130.11",
"SubUrl": "/ZSZQ/fileDraft",
"SystemKey": "fF2U9HXs7dm6Hjz5X", //OA系统key
"ObjectClass": "ZSZQ_CWYSPJYQRSDZWF", //OA文件类别
"Urgent": 1, //紧急程度,1一般 2紧急 3加急
"Issend": 0 //流程是否自动发送,0不发送,1自动发送下一步
}
}
+1
View File
@@ -78,6 +78,7 @@
"MaxThreadPercent": 0.6, //占系统资源最多60%的线程数量
"oa_confg": {
"BaseUrl": "http://ip:port",
"SubUrl": "/ZSZQ/fileDraft",
"SystemKey": "M001", //OA系统key
"ObjectClass": "ZSZQ_ZDNX", //OA文件类别
"Urgent": 1, //紧急程度,1一般 2紧急 3加急
+9 -1
View File
@@ -73,5 +73,13 @@
"Schema": "APPQOSSYS"
},
"SendKafakaCron": "10 0 * * *",
"MaxThreadPercent": 0.6 //占系统资源最多60%的线程数量
"MaxThreadPercent": 0.6, //占系统资源最多60%的线程数量
"oa_confg": {
"BaseUrl": "http://10.52.130.11",
"SubUrl": "/ZSZQ/fileDraft",
"SystemKey": "fF2U9HXs7dm6Hjz5X", //OA系统key
"ObjectClass": "ZSZQ_CWYSPJYQRSDZWF", //OA文件类别
"Urgent": 1, //紧急程度,1一般 2紧急 3加急
"Issend": 0 //流程是否自动发送,0不发送,1自动发送下一步
}
}
+1
View File
@@ -76,6 +76,7 @@
"MaxThreadPercent": 0.6, //占系统资源最多60%的线程数量
"oa_confg": {
"BaseUrl": "http://10.52.130.11",
"SubUrl": "/ZSZQ/fileDraft",
"SystemKey": "fF2U9HXs7dm6Hjz5X", //OA系统key
"ObjectClass": "ZSZQ_CWYSPJYQRSDZWF", //OA文件类别
"Urgent": 1, //紧急程度,1一般 2紧急 3加急