diff --git a/YLErpWeb/Views/SwapTrade2/OperationHistory.cshtml b/YLErpWeb/Views/SwapTrade2/OperationHistory.cshtml
index 70c6aa12..1cf2744f 100644
--- a/YLErpWeb/Views/SwapTrade2/OperationHistory.cshtml
+++ b/YLErpWeb/Views/SwapTrade2/OperationHistory.cshtml
@@ -16,14 +16,14 @@
diff --git a/YLErpWeb/Views/SwapTrade2/SwapUnwind.cshtml b/YLErpWeb/Views/SwapTrade2/SwapUnwind.cshtml
index 69344c11..f14749ab 100644
--- a/YLErpWeb/Views/SwapTrade2/SwapUnwind.cshtml
+++ b/YLErpWeb/Views/SwapTrade2/SwapUnwind.cshtml
@@ -26,6 +26,8 @@
+
+
}
@@ -197,6 +199,8 @@
期初标的价格 |
期末标的交割全价% |
期末标的价格 |
+ @* EQD-6953 期末标的结算收益率:仅普通债券类收益互换显示,期末交割全价回车反算,可手填覆盖 *@
+
期末标的结算收益率% |
数量 |
交易费用(平仓) |
交易费用(待结算) |
@@ -223,11 +227,17 @@
{{priceFormat(floatPosition.PosiGrossPrice)}} |
-
+
+ 源AUTOREV
|
+ @* EQD-6953 期末标的结算收益率:回车以它为源反算交割全价(联动盈亏);手填未回车=REV人工输入 *@
+
+
+ 源AUTOREV
+ |
{{formatQuantity(deal.CloseQty)}} |
diff --git a/YLErpWeb/Views/SwapTrade2/tradeEndConfirmList.cshtml b/YLErpWeb/Views/SwapTrade2/tradeEndConfirmList.cshtml
index 28fd4d8a..e9290c4e 100644
--- a/YLErpWeb/Views/SwapTrade2/tradeEndConfirmList.cshtml
+++ b/YLErpWeb/Views/SwapTrade2/tradeEndConfirmList.cshtml
@@ -31,6 +31,7 @@
+
}
diff --git a/YLErpWeb/Views/underlying_manager/underlying_managerEdit.cshtml b/YLErpWeb/Views/underlying_manager/underlying_managerEdit.cshtml
index 6ea28715..67e3501d 100644
--- a/YLErpWeb/Views/underlying_manager/underlying_managerEdit.cshtml
+++ b/YLErpWeb/Views/underlying_manager/underlying_managerEdit.cshtml
@@ -8,6 +8,8 @@
showDeltaS_S = PS.Config.Is长江
};
var bond = Model.Bond ?? new UnderlyingBond();
+ // ETF 子类下拉直接读取前端可维护字典;空选项用于新增页面的必填提示。
+ var etfSubtypeItems = YLErp.BLL.DictionaryBLL.GetList("ETF 子类", true, underlying.EtfSubType);
var blocks = new[] { underlying.Block1, underlying.Block2, underlying.Block3, underlying.Block4, underlying.Block5 };
for (var i = 1; i <= 5; i++)
{
@@ -28,13 +30,14 @@
}
}
- .None, .Stock, .CommodityFutures, .Bonds {
+ .None, .Stock, .CommodityFutures, .Bonds, .Fund {
display: none;
}
.form-Stock .Stock,
.form-CommodityFutures .CommodityFutures,
- .form-Bonds .Bonds {
+ .form-Bonds .Bonds,
+ .form-Fund .Fund {
display: block;
}
@@ -323,6 +326,31 @@
+
+ @* 仅基金及基金专户维护基金管理人 *@
+
+
+
+
+
+ @* 重点功能:ETF 子类由系统字典维护,使用 Fund 类控制显隐,并固定放在表单最后 *@
+
+
+ *
+
@@ -334,4 +362,4 @@
-
\ No newline at end of file
+
diff --git a/YLErpWeb/Views/underlying_manager/underlying_managerView.cshtml b/YLErpWeb/Views/underlying_manager/underlying_managerView.cshtml
index 731c26d4..2b17d61a 100644
--- a/YLErpWeb/Views/underlying_manager/underlying_managerView.cshtml
+++ b/YLErpWeb/Views/underlying_manager/underlying_managerView.cshtml
@@ -49,6 +49,14 @@
@Html.MyDisplayFor(m => m.UnderlyingEnName)
@Html.MyDisplayFor(m => m.BBGTicker)
+
+ @if (Model.UnderlyingInstrumentType == ConsGlobal.InstrumentType.Fund)
+ {
+ |
+ @Html.MyDisplayFor(m => m.InvestAdvisorName)
+ @Html.MyDisplayFor(m => m.EtfSubType)
+
+ }
@Html.MyDisplayFor(m => m.UnderlyingType)
@if (pageObj.showDeltaS_S)
@@ -226,4 +234,4 @@
}
-}
\ No newline at end of file
+}
diff --git a/YLErpWeb/WebAPI/Controllers/TradeApprovalOAJobController.cs b/YLErpWeb/WebAPI/Controllers/TradeApprovalOAJobController.cs
new file mode 100644
index 00000000..ffda966e
--- /dev/null
+++ b/YLErpWeb/WebAPI/Controllers/TradeApprovalOAJobController.cs
@@ -0,0 +1,25 @@
+using System.Text.Json;
+using YLErp.Helpers;
+using YLErp.Model;
+using YLErp.Modules.TradeModule;
+
+namespace YLErp.Web.WebAPI.Controllers
+{
+ /// 国联民生衍生品移动审批轮询入口,由 PowerJob 等外部调度器调用。
+ [ApiController]
+ public class TradeApprovalOAJobController : ControllerBase
+ {
+ [HttpPost]
+ [Route("api/job/tradeApproval/syncOAStatus")]
+ public JsonResult SyncOAStatus([FromQuery] string requestId = null)
+ {
+ var configKey = AppManager.GetConfiguration()["JobConfig:ApiKey"];
+ if (!string.IsNullOrEmpty(configKey) && Request.Headers["X-Job-Api-Key"].FirstOrDefault() != configKey)
+ return new JsonResult(new { code = 401, msg = "Invalid API Key" });
+
+ var user = new OptUserInfo(0, "系统移动审批同步", OptUserFrom.System);
+ var messages = new TradeApprovalOAService(user).SyncPendingStatuses(requestId);
+ return new JsonResult(new { code = 0, data = new { total = messages.Count, details = messages } }, new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });
+ }
+ }
+}
diff --git a/YLErpWeb/WebAPI/Controllers/TradeApprovalOaMockController.cs b/YLErpWeb/WebAPI/Controllers/TradeApprovalOaMockController.cs
new file mode 100644
index 00000000..e5bafa15
--- /dev/null
+++ b/YLErpWeb/WebAPI/Controllers/TradeApprovalOaMockController.cs
@@ -0,0 +1,110 @@
+using System.Collections.Concurrent;
+using System.Text.Json;
+using YLErp.Helpers;
+
+namespace YLErp.Web.WebAPI.Controllers
+{
+ ///
+ /// 仅供本地开发验证收益互换移动审批调用链的 OA 模拟接口。
+ ///
+ [ApiController]
+ [Route("api/mock/tradeApprovalOa")]
+ public class TradeApprovalOaMockController : ControllerBase
+ {
+ private static readonly ConcurrentDictionary Flows = new();
+ private static readonly JsonSerializerOptions JsonOptions = new()
+ {
+ PropertyNamingPolicy = JsonNamingPolicy.CamelCase
+ };
+
+ [HttpPost("createOaFlow")]
+ public IActionResult CreateOaFlow([FromBody] JsonElement payload)
+ {
+ if (!IsEnabled()) return NotFound();
+
+ var requestId = "mock-" + Guid.NewGuid().ToString("N");
+ Flows[requestId] = new MockOaFlow { RequestId = requestId };
+ return Json(new { code = 0, data = new { msg = string.Empty, requestid = requestId }, status = "SUCCESS" });
+ }
+
+ [HttpGet("getRequestData")]
+ public IActionResult GetRequestData([FromQuery] string requestId)
+ {
+ if (!IsEnabled()) return NotFound();
+
+ if (!Flows.TryGetValue(requestId ?? string.Empty, out var flow))
+ return Json(new { code = 0, data = Array.Empty