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

312 lines
11 KiB
C#

using YLErp.BLL;
using YLErp.BLL.Eod;
using YLErp.Model.Enum;
using YLErp.Modules.SystemModule;
namespace YLErp.Modules.TradeModule.DealModule
{
/// <summary>
/// 交易复核审批操作
/// </summary>
public class TradeCheckService : TradeServiceBase
{
public TradeCheckService(YLBaseService baseService) : base(baseService)
{
}
public TradeCheckService(OptUserInfo userInfo) : base(userInfo)
{
}
/// <summary>
///
/// </summary>
public TradeCheckResult TradeCheck(OtcOptionTradeFull req, string additionalProcessing)
{
var tradeConv = TradeConverter.ConvertOptionTrade(req);
return TradeCheck(tradeConv, additionalProcessing);
}
public TradeCheckResult TradeCheck(trade req, string additionalProcessing)
{
if (req is null)
{
throw new ArgumentNullException(nameof(req));
}
var dbTrade = base.DbContext.trade.Find(req.id);
if (dbTrade == null)
{
throw new ServiceException("系统中没有此交易");
}
if (dbTrade.CheckStatus == 1)
{
throw new ServiceException("已经复核,不需要再次复核");
}
dbTrade.MetaDic = DbContext.TradeMeta.Where(a => a.TradeId == req.id).ToDictionary(a => a.MetaKey, a => a.MetaValue);
tradeBLL.SetFieldsByTradeType(dbTrade);
if (!req.PremiumPayDate.HasValue)
{
req.PremiumPayDate = req.TradeDate;
}
if (req.TradeType == "价差期权")
{
var errMsg = SpreadOptionValidator.Validate(req);
if (!string.IsNullOrEmpty(errMsg))
{
throw new ServiceException(errMsg);
}
}
var diffList = TradeCheckUtil.GetDiffs(dbTrade, req);
if (diffList?.Count > 0)
{
return new TradeCheckResult { diffList = diffList, message = "交易复核失败!" };
}
var ignoreMoneyCheck = (valuedateBLL.SystemDate.SpecialOperateForTrade == 1) &&
additionalProcessing == tradeBLL.LackOfMoney;
if (!ignoreMoneyCheck && !RealtimePnlCalc.TradeCanBeConfirm(dbTrade.ClientId, dbTrade, out var errorMsg))
{
string message;
if (PS.Config.Is申万)
{
message = "交易复核:复核数据正确," + errorMsg;
}
else
{
var client = DataCacheProvider.GetClientDataSource().GetData(dbTrade.ClientId);
message = $"交易复核:复核数据正确,客户:{client?.Name},交易编号:{dbTrade.TradeNumber},{errorMsg}";
}
//如果客户缺少资金而交易特批已开启
if (valuedateBLL.SystemDate.SpecialOperateForTrade == 1)
{
return new TradeCheckResult
{
success = true,
proccessType = "AdditionalProcessing",
type = tradeBLL.LackOfMoney,
message = message,
specialOperateForTrade = true
};
}
return new TradeCheckResult { message = message };
}
if (PS.Config.Company != Configuration.CompanyEnum.国海)
{
dbTrade.CheckStatus = Convert.ToInt32(TradeCheckEnum.StatusOfNew);
}
DbContext.SaveChanges();
// 如果是审批组
var tradeProcess = TradeProcess();
var orderIdCount = tradeProcess.Where(x => x.order == dbTrade.ProcessOrderId);//判断是否有分支
int processOrderNode = orderIdCount.Count() > 1 ? dbTrade.ProcessOrderBranch : 0;
if (orderIdCount.Count() == 1)
{
processOrderNode = orderIdCount.First().node ?? 0;
}
var ruleTypes = tradeProcess.FirstOrDefault(o => o.order == dbTrade.ProcessOrderId &&o.node== processOrderNode && o.processType == "TradeProcess").ruleType;
var passStatus = 0;
if (ruleTypes != null && ruleTypes.Contains("1"))
{
passStatus = new ApprovalProcessService(OptUser).CheckTradeApprovalStep(dbTrade, OptUser.UserId, true);
}
var result = new TradeOpenService(this).UpdateTradeProcessLog(new TradeOpenReqModel
{
tradeId = dbTrade.id,
status = "pass",
comments = "交易复核审批成功",
ignoreMoneyCheck = true,
notNeedOperationHistory = true
});
if (result.RetCode != TradeOpenRetCode.Success && !string.IsNullOrWhiteSpace(result.ErrorMsg))
{
return new TradeCheckResult { message = result.ErrorMsg };
}
//删掉trade_check相关的复核数据
DeleteTradeCheck(dbTrade.id);
//生成文档
if (PS.Config.IsAutoGenerateContracts && dbTrade.TradeStatus == ConsTrade.确认成交 && dbTrade.TradeType != "远期")
{
new TradeContractGenerateService(this).GenerateContractsAsync(new List<int> { dbTrade.id }, "确认书");
}
if (PS.Config.Is宏源)
{
var optType = "";
if (req.MetaDic.ContainsKey("volLimit"))
{
optType = "审核波动率为:" + req.MetaDic["volLimit"];
}
DbContext.TradeAuditLog.Add(new TradeAuditLog
{
TradeId = dbTrade.id,
AuditFlag = TradeAuditFlag.operation,
OptType = optType,
Changes = string.Empty,
DataType = "00",
OptId = UserId,
OptName = UserName,
OptDate = OptDate
});
}
new SalesModule.SalesCommissionDataService(OptUser).SetCommissionVaild(req.id);
new TradeConfirmService(this).EditReportStatus(req.id);
SaveTradeOperationHistory(dbTrade, ignoreMoneyCheck ? "交易特批-交易复核成功" : "交易复核成功");
return new TradeCheckResult { success = true, message = "复核审批成功!" };
}
public bool TradeScaleCheck(int eid, bool isContinue = false)
{
var trade = DbContext.trade.Find(eid);
var passStatus = new ApprovalProcessService(OptUser).CheckTradeApprovalStep(trade, OptUser.UserId);
switch (passStatus)
{
case -3: throw new ServiceException("当前存在分支交易审批流程,检测到申请人不满足任意一个分支进入条件,无法提交审批,请更换申请人或调整审批组");
case -2: throw new ServiceException("未进行字段审核");
case -1:
if (!isContinue)
{
return false;
}
break;
case 1:
break;
case 0:
new SalesModule.SalesCommissionDataService(OptUser).SetCommissionVaild(trade.id);
new TradeConfirmService(this).EditReportStatus(trade.id);
var result = new TradeOpenService(this).UpdateTradeProcessLog(new TradeOpenReqModel
{
tradeId = eid,
status = "pass",
comments = "交易复核审批成功",
ignoreMoneyCheck = true,
notNeedOperationHistory = true
});
break;
}
DbContext.SaveChanges();
return true;
}
public TradeCheckResult TradeGroupCheck(OtcOptionTradeFull reqFull)
{
var req = TradeConverter.ConvertOptionTrade(reqFull);
if (req is null)
{
throw new ArgumentNullException(nameof(req));
}
var dbTrade = base.DbContext.trade.Find(req.id);
if (dbTrade == null)
{
throw new ServiceException("系统中没有此交易");
}
if (dbTrade.CheckStatus == 1)
{
throw new ServiceException("已经复核,不需要再次复核");
}
tradeBLL.SetFieldsByTradeType(dbTrade);
if (!req.PremiumPayDate.HasValue)
{
req.PremiumPayDate = req.TradeDate;
}
else if (req.PremiumPayDate < req.TradeDate && req.PremiumPayDate > req.ExerciseDate)
{
throw new ServiceException("权利金应付日必须介于交易日与到期日之间!");
}
var diffList = TradeCheckUtil.GetDiffs(dbTrade, req);
if (diffList?.Count > 0)
{
return new TradeCheckResult { diffList = diffList, message = "交易复核失败!" };
}
dbTrade.CheckStatus = Convert.ToInt32(TradeCheckEnum.StatusOfNew);
DbContext.SaveChanges();
var result = new TradeOpenService(this).UpdateTradeProcessLog(new TradeOpenReqModel
{
tradeId = dbTrade.id,
status = "pass",
comments = "交易复核审批成功",
ignoreMoneyCheck = true,
notNeedOperationHistory = true
});
if (result.RetCode != TradeOpenRetCode.Success && !string.IsNullOrWhiteSpace(result.ErrorMsg))
{
return new TradeCheckResult { message = result.ErrorMsg };
}
//删掉trade_check相关的复核数据
DeleteTradeCheck(dbTrade.id);
//生成文档
if (PS.Config.IsAutoGenerateContracts && dbTrade.TradeStatus == ConsTrade.确认成交 && dbTrade.TradeType != "远期")
{
new TradeContractGenerateService(this).GenerateContractsAsync(new List<int> { dbTrade.id }, "确认书");
}
SaveTradeOperationHistory(dbTrade, "交易复核成功");
return new TradeCheckResult { success = true, message = "复核审批成功!" };
}
/// <summary>
///
/// </summary>
public void DeleteTradeCheck(int tradeId)
{
var tradeCheck = tradeId > 0
? DbContext.trade_check.FirstOrDefault(t => t.TradeId == tradeId && t.ValidState != "InValid")
: null;
if (tradeCheck != null)
{
SetDBModelOpt(tradeCheck);
tradeCheck.ValidState = "InValid";
DbContext.SaveChanges();
}
}
}
/// <summary>
/// 交易检查结果(字段大小写不要改变以与前端对应)
/// </summary>
public class TradeCheckResult
{
public bool success { get; set; }
public string proccessType { get; set; }
public string type { get; set; }
public int TrialDataId { get; set; }
public string message { get; set; }
public HashSet<string> diffList { get; set; }
public bool specialOperateForTrade { get; set; }
}
}