Files
zszq-trs/YLErpDAL/Modules/TradeModule/DealModule/TradeRevokeService.cs
T
2024-05-09 14:06:26 +08:00

122 lines
5.3 KiB
C#

namespace YLErp.Modules.TradeModule.DealModule
{
/// <summary>
/// 交易审批撤回操作
/// </summary>
public class TradeRevokeService : TradeServiceBase
{
public TradeRevokeService(YLBaseService baseService) : base(baseService)
{
}
public TradeRevokeService(OptUserInfo userInfo) : base(userInfo)
{
}
public void TradeRevoke(string tradeNumber)
{
if (string.IsNullOrWhiteSpace(tradeNumber))
{
throw new ArgumentException("交易编号不能为空", nameof(tradeNumber));
}
var td = DbContext.trade.FirstOrDefault(t => t.TradeNumber == tradeNumber);
if (td == null)
{
throw new ServiceException("找不到交易信息,交易编号:" + tradeNumber);
}
if (td.TradeStatus != ConsTrade.行权待复核 && td.TradeStatus != ConsTrade.平仓待复核 && td.TradeStatus != ConsTrade.互换待复核)
{
throw new ServiceException($"交易'{tradeNumber}'的交易状态'{td.TradeStatus}'不符合撤回复核操作的条件");
}
TradeRevoke(new[] { td }, td.TradeStatus == ConsTrade.平仓待复核 ? 0 : 1);
}
public void TradeRevoke(IEnumerable<int> tradeids, int actionType)
{
var tradeIds = GetTradeIdsWithChildren(tradeids);
var revokeTrades = DbContext.trade.Where(t => tradeIds.Contains(t.id)).ToList();
TradeRevoke(revokeTrades, actionType);
}
private void TradeRevoke(IEnumerable<trade> revokeTrades, int actionType)
{
if (revokeTrades is null || !revokeTrades.Any())
{
return;
}
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 =>
{
x.Status = "已执行";
x.IsDeleted = true;
});
//DbContext.trade_cash.RemoveRange(revokeTrade_cashs);
var tradeCashIds = revokeTrade_cashs.Select(x => x.id).ToList();
var tradeCashDetials = DbContext.trade_cash_detail.Where(x => tradeCashIds.Contains(x.TradeCashId));
if (tradeCashDetials.Any())
{
DbContext.trade_cash_detail.RemoveRange(tradeCashDetials);
}
var trade_cash_swaps = DbContext.trade_cash_swap.Where(x => tradeCashIds.Contains(x.TradeCashId));
if (trade_cash_swaps.Any())
{
DbContext.trade_cash_swap.RemoveRange(trade_cash_swaps);
}
foreach (var td in revokeTrades)
{
//判断如果为待确认的则修改状态为确认状态
if (td == null || (td.TradeStatus != ConsTrade.行权待复核 && td.TradeStatus != ConsTrade.平仓待复核 && td.TradeStatus != ConsTrade.互换待复核))
{
throw new ServiceException("撤回失败,找不到要平仓的主交易,该交易不处于待复核状态,不能被撤回!");
}
td.TradeStatus = ConsTrade.确认成交;
td.CheckStatus = null;
td.ProcessOrderId = ProcessTradeLog.审批通过;
td.ProcessStatus = ProcessTradeStatus.通过审批.ToString();
AddTradeOperationHistoryAndSetParentTradeInfo(false, td, actionType == 0 ? "平仓待复核撤回" : (actionType == 1 ? "行权待复核撤回" : "互换待复核撤回"));
}
DbContext.SaveChanges();
}
public void TradeWithdraw(IEnumerable<int> tradeids)
{
var tradeIds = GetTradeIdsWithChildren(tradeids);
var Withdraws = DbContext.trade.Where(t => tradeIds.Contains(t.id)).ToList();
foreach (var td in Withdraws)
{
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;
td.ProcessOrderId = 0;
td.IsApproval = false;
AddTradeOperationHistoryAndSetParentTradeInfo(false, td, "交易撤回");
}
DbContext.SaveChanges();
}
/// <summary>
/// 获取包含黑箱结构的子交易集合
/// </summary>
/// <param name="tradeids"></param>
/// <returns></returns>
private List<int> GetTradeIdsWithChildren(IEnumerable<int> tradeids)
{
List<int> tradeIds = tradeids.ToList();
var childrenTrades = DbContext.trade_cash_group_action.Where(x => tradeids.Contains(x.ParentTradeId) && x.Status == "待完成");
DbContext.trade_cash_group_action.RemoveRange(childrenTrades);
var childrenTradeIds = childrenTrades.Select(s=>s.TradeId);
tradeIds.AddRange(childrenTradeIds);
return tradeIds;
}
}
}