feat: 收益互换开平仓及收益结算接入OA移动审批
#EQD-6425 国联民生-衍生品系统移动审批(提交OA流程) - 审批节点支持配置“关联OA移动审批” - 创建OA流程并记录请求、requestId、状态及异常备注 - 支持OA轮询同步审批通过、退回和归档状态 - 本地通过、拒绝、撤回时同步强制归档未结束OA流程 - 增加审批列表OA备注展示及本地Mock联调接口 - 新增OA审批记录表和数据库升级脚本 - OA移动审批使用独立查询地址及isnextflow配置,不影响交易确认书OA
This commit is contained in:
@@ -263,6 +263,10 @@ namespace YLErp.Modules.TradeModule.DealModule
|
||||
td.OptName = UserName;
|
||||
td.OptDate = OptDate;
|
||||
int passStatus = new ApprovalProcessService(OptUser).CheckTradeApprovalStep(td, OptUser.UserId);
|
||||
if (passStatus != 0 && passStatus != -3)
|
||||
{
|
||||
new TradeApprovalOAService(this).EnsureForCurrentNode(td);
|
||||
}
|
||||
if (passStatus == 0)
|
||||
{
|
||||
td.TradeStatus = ConsTrade.确认成交;
|
||||
|
||||
@@ -56,6 +56,23 @@ namespace YLErp.Modules.TradeModule.DealModule
|
||||
throw new ServiceException("该交易状态已变更,不能被审批,请先刷新页面");
|
||||
}
|
||||
|
||||
if (!req.isFromOa && (req.status == "pass" || req.status == "reject"))
|
||||
{
|
||||
var currentNode = TradeProcessByCategory(td)
|
||||
.Where(x => x.order == td.ProcessOrderId && (x.node == 0 || x.node == td.ProcessOrderBranch))
|
||||
.OrderByDescending(x => x.node == td.ProcessOrderBranch)
|
||||
.FirstOrDefault();
|
||||
if (currentNode?.isOaApproval == true)
|
||||
{
|
||||
var oa = DbContext.tradeApprovalOaResult.FirstOrDefault(x => x.trade_id == td.id
|
||||
&& x.approval_process_id == currentNode.id
|
||||
&& x.is_valid
|
||||
&& (x.status == "提交成功" || x.status == "同步中" || x.status == "归档中"));
|
||||
if (oa != null && !new TradeApprovalOAService(this).ArchiveForLocalAction(oa, out var errorMessage))
|
||||
throw new ServiceException(errorMessage);
|
||||
}
|
||||
}
|
||||
|
||||
if (req.status == "pass")
|
||||
{
|
||||
return TradePass(req, td);
|
||||
@@ -179,6 +196,13 @@ namespace YLErp.Modules.TradeModule.DealModule
|
||||
return result;
|
||||
}
|
||||
|
||||
// 关联 OA 的节点必须先成功创建 OA 流程,才允许本地审批推进到该节点。
|
||||
if (nextOrder.isOaApproval && td.TradeType == "收益互换")
|
||||
{
|
||||
// OA 创建是节点通过后的外部动作;明确失败只记录在 OA 结果表,不能回滚本地节点通过。
|
||||
new TradeApprovalOAService(this).CreateForNode(td, nextOrder);
|
||||
}
|
||||
|
||||
//-----------------------------------------------
|
||||
// 继续审批流转
|
||||
//-----------------------------------------------
|
||||
@@ -788,6 +812,7 @@ namespace YLErp.Modules.TradeModule.DealModule
|
||||
public bool notNeedOperationHistory;
|
||||
public bool isPartialExercise;
|
||||
public bool isExpire = false;
|
||||
public bool isFromOa;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -50,6 +50,11 @@
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (var td in revokeTrades)
|
||||
{
|
||||
ArchiveActiveOaOrThrow(td);
|
||||
}
|
||||
|
||||
var tradeids = revokeTrades.Select(n => n.id);
|
||||
var revokeTrade_cashs = DbContext.trade_cash.Where(c => c.ValidState == "InValid" && !c.IsDeleted && tradeids.Contains(c.TradeId)).ToList();
|
||||
revokeTrade_cashs.ForEach(x =>
|
||||
@@ -94,6 +99,7 @@
|
||||
var Withdraws = DbContext.trade.Where(t => tradeIds.Contains(t.id)).ToList();
|
||||
foreach (var td in Withdraws)
|
||||
{
|
||||
ArchiveActiveOaOrThrow(td);
|
||||
var changesTradeStatus = DbContext.TradeAuditLog.Where(x => (x.OptType == "确认交易" || x.OptType == "交易特批-确认交易") && x.TradeId == td.id).OrderByDescending(x => x.id)?.FirstOrDefault()?.Changes;
|
||||
td.TradeStatus = changesTradeStatus == ConsTrade.新增待确认 ? ConsTrade.新增待确认 : ConsTrade.修改待确认;
|
||||
td.CheckStatus = null;
|
||||
@@ -103,6 +109,12 @@
|
||||
}
|
||||
DbContext.SaveChanges();
|
||||
}
|
||||
|
||||
private void ArchiveActiveOaOrThrow(trade td)
|
||||
{
|
||||
if (!new TradeApprovalOAService(this).ArchiveActiveForTrade(td, out var errorMessage))
|
||||
throw new ServiceException(errorMessage);
|
||||
}
|
||||
/// <summary>
|
||||
/// 获取包含黑箱结构的子交易集合
|
||||
/// </summary>
|
||||
|
||||
Reference in New Issue
Block a user