using System.Linq.Expressions;
using YLErp.Configuration;
using YLErp.DBModels;
using YLErp.DBModels.Consts;
using YLErp.DBModels.Enums;
using YLErp.Model;
namespace YLErp.Modules.TradeModule.DocGenerateModule
{
///
/// 国联收益互换审批前生成确认书的范围与资料校验。
///
public static class GuolianSwapConfirmBookScope
{
private static readonly HashSet PreApprovalStatuses = new()
{
ConsTrade.新增待确认,
ConsTrade.修改待确认,
ConsTrade.审批中
};
public static bool IsPreApprovalTrade(trade trade)
{
return IsPreApprovalTrade(trade, PS.Config.Company);
}
public static bool IsPreApprovalTrade(trade trade, CompanyEnum company)
{
return IsGuolianSwap(trade, company)
&& trade.ValidState != ConsGlobal.InValid
&& IsPreApprovalStatus(trade.TradeStatus);
}
public static bool IsGuolianSwap(trade trade)
{
return IsGuolianSwap(trade, PS.Config.Company);
}
public static bool IsGuolianSwap(trade trade, CompanyEnum company)
{
return company == CompanyEnum.国联 && trade.TradeType == "收益互换";
}
public static bool IsPreApprovalStatus(string tradeStatus)
{
return PreApprovalStatuses.Contains(tradeStatus);
}
}
///
/// 清理国联收益互换审批前生成的确认书,不复用按合同编号批量清理的通用逻辑。
///
public class GuolianSwapConfirmBookCleanupService : YLBaseService
{
public GuolianSwapConfirmBookCleanupService(YLBaseService baseService) : base(baseService)
{
}
public void InvalidateAfterEdit(trade trade)
{
if (!GuolianSwapConfirmBookScope.IsGuolianSwap(trade)
|| !GuolianSwapConfirmBookScope.IsPreApprovalStatus(trade.TradeStatus))
{
return;
}
InvalidateRelations(trade.id);
}
public void CleanRejectedPreApprovalTrade(trade trade)
{
if (!GuolianSwapConfirmBookScope.IsGuolianSwap(trade))
{
return;
}
GlobalConfig.SealHandler.RemoveQueue(trade.id);
InvalidateOaResults(trade.id);
var contractCodes = InvalidateRelations(trade.id);
foreach (var contractCode in contractCodes)
{
var hasActiveReference = DbContext.trade_contract_r.Any(
BuildOtherActiveReferencePredicate(contractCode, trade.id));
if (!hasActiveReference)
{
var documents = DbContext.trade_contract_document.Where(x => x.Code == contractCode
&& x.Type == ContractTypeEnum.Trade);
DbContext.trade_contract_document.RemoveRange(documents);
}
}
}
public static Expression> BuildOtherActiveReferencePredicate(
string contractCode,
int rejectedTradeId)
{
return relation => relation.ContractCode == contractCode
&& relation.Type == ContractTypeEnum.Trade
&& relation.IsValid
&& relation.TradeId != rejectedTradeId;
}
public static Expression> BuildTradeConfirmationRelationPredicate(
int tradeId)
{
return relation => relation.TradeId == tradeId
&& relation.Type == ContractTypeEnum.Trade;
}
public static Expression> BuildActiveOaResultPredicate(
int tradeId)
{
return result => result.trade_id == tradeId && result.is_valid;
}
private void InvalidateOaResults(int tradeId)
{
var oaResults = DbContext.tradeContractOaResult
.Where(BuildActiveOaResultPredicate(tradeId))
.ToList();
oaResults.ForEach(x => x.is_valid = false);
}
private List InvalidateRelations(int tradeId)
{
var relations = DbContext.trade_contract_r
.Where(BuildTradeConfirmationRelationPredicate(tradeId))
.ToList();
relations.Where(x => x.IsValid).ToList().ForEach(x => x.IsValid = false);
return relations.Select(x => x.ContractCode).Distinct().ToList();
}
}
///
/// 仅校验模板无法正常生成或选择时必需的交易数据。
///
public class GuolianSwapConfirmBookValidationService : YLBaseService
{
public GuolianSwapConfirmBookValidationService(YLBaseService baseService) : base(baseService)
{
}
public List Validate(trade trade)
{
var errors = new List();
var client = DataCacheProvider.GetClientDataSource().GetData(trade.ClientId);
var underlying = DataCacheProvider.GetUnderlyingDataSource().GetData(trade.UnderlyingCode);
if (client == null)
{
errors.Add("客户信息不存在");
return errors;
}
if (underlying == null)
{
errors.Add("标的信息不存在");
}
ValidateInitialPosition(trade, errors);
return errors;
}
private void ValidateInitialPosition(trade trade, List errors)
{
var position = DbContext.swap_position.FirstOrDefault(x => x.SwapTradeId == trade.id
&& x.IsInitial
&& !x.Invalid
&& (x.PositionType == (int)PositionTypeFlag.Long || x.PositionType == (int)PositionTypeFlag.Short));
if (position == null)
{
errors.Add("缺少初始标的持仓");
return;
}
if (position.PosiDirection != (int)SwapDirectionEnum.支付
&& position.PosiDirection != (int)SwapDirectionEnum.收取)
{
errors.Add("初始标的持仓收支方向无效");
}
if (string.IsNullOrWhiteSpace(position.UnderlyingCode))
{
errors.Add("初始标的持仓缺少标的代码");
}
}
}
}