fix: 国联民生收益互换支持审批前生成交易确认书

- 仅国联民生收益互换支持在新增待确认、修改待确认、审批中生成交易确认书,期权、其他公司及其他交易状态保持原限制
- 交易确认书页面同步开放上述交易的“生成确认书”按钮,后端批量生成链路同步放开状态过滤
- 审批前生成仅校验客户、标的、初始持仓等模板必需核心数据;不以银行账户、联系人、保证金等非模板必填资料阻断
- 审批前已生成确认书的交易被修改时,使该交易原确认书关联失效,重新生成仍按原覆盖逻辑处理
- 审批拒绝时清理该交易审批前生成的确认书关联、OA 结果及用印队列;无其他有效引用时删除确认书数据,避免遗留无效确认书
- 保持原交易编号逻辑:自动生成和手工填写均不复用已拒绝交易编号
- 新增审批前适用范围、确认书关联及 OA 清理谓词专项单测
This commit is contained in:
tengyufan
2026-07-30 11:10:48 +08:00
parent c519dcf44f
commit b3484c3618
7 changed files with 335 additions and 7 deletions
@@ -226,9 +226,10 @@ namespace YLErp.Modules.TradeModule.DealModule
return true;
}
// 过滤掉待确认和审批中的交易,这些状态不允许生成确认书
// 仅国联收益互换允许在审批前生成确认书,其他交易保持原状态限制。
var invalidStatusList = new List<string> { ConsTrade., ConsTrade., ConsTrade. };
var invalidTrades = trades.Where(t => invalidStatusList.Contains(t.TradeStatus)).ToList();
var invalidTrades = trades.Where(t => invalidStatusList.Contains(t.TradeStatus)
&& !GuolianSwapConfirmBookScope.IsPreApprovalTrade(t)).ToList();
if (invalidTrades.Any())
{
error.AddRange(invalidTrades.Select(t => $"交易 {t.TradeNumber} 状态为【{t.TradeStatus}】,不能生成确认书"));
@@ -237,6 +238,20 @@ namespace YLErp.Modules.TradeModule.DealModule
logger.Info($"[GJGenerateConfirmBook] 过滤掉 {invalidTrades.Count} 笔待确认/审批中交易");
}
var preApprovalTrades = trades.Where(GuolianSwapConfirmBookScope.IsPreApprovalTrade).ToList();
foreach (var trade in preApprovalTrades)
{
var validationErrors = new GuolianSwapConfirmBookValidationService(this).Validate(trade);
if (!validationErrors.Any())
{
continue;
}
error.Add($"交易 {trade.TradeNumber} 无法生成确认书:{string.Join("", validationErrors)}");
tradeIds = tradeIds.Where(id => id != trade.id).ToList();
trades = trades.Where(item => item.id != trade.id).ToList();
}
if (!trades.Any())
{
logger.Info("[GJGenerateConfirmBook] 过滤后无有效交易可生成确认书");
@@ -7,6 +7,7 @@ using YLErp.Model.Enum;
using YLErp.Modules.ClientModule;
using YLErp.Modules.SwapModule;
using YLErp.Modules.TradeDalModule;
using YLErp.Modules.TradeModule.DocGenerateModule;
namespace YLErp.Modules.TradeModule.DealModule
{
@@ -295,6 +296,7 @@ namespace YLErp.Modules.TradeModule.DealModule
/// </summary>
private TradeOpenResult TradeReject(TradeOpenReqModel req, trade td)
{
var isGuolianPreApprovalTrade = GuolianSwapConfirmBookScope.IsPreApprovalTrade(td);
var oldOrderId = td.ProcessOrderId;
req.comments = FormatCommentsWithRole(oldOrderId, req.comments);
td.ProcessOrderId = Convert.ToInt32(PStatusEnum.reject);
@@ -367,6 +369,11 @@ namespace YLErp.Modules.TradeModule.DealModule
var tcDetails = DbContext.trade_cash_detail.Where(O => O.TradeCashId == tcId);
DbContext.trade_cash_detail.RemoveRange(tcDetails);
if (isGuolianPreApprovalTrade)
{
new GuolianSwapConfirmBookCleanupService(this).CleanRejectedPreApprovalTrade(td);
}
DbContext.SaveChanges();
return new TradeOpenResult(td) { RetCode = TradeOpenRetCode.Success };