using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using YieldChain.Helpers; using YLErp.Helpers; namespace YLErp.Modules.TradeModule { public class TradeReportService : TradeServiceBase { public TradeReportService(OptUserInfo userInfo) : base(userInfo) { } public trade_report SaveTradeReport(trade_report req) { if (req is null) { throw new ArgumentNullException(nameof(req)); } if (CheckTradeReport(req, out string message)) { throw new ServiceException(message); } var trade = DbContext.trade.Find(req.TradeId); if (trade.OpponentRole == req.FillingPartyRole) { throw new ServiceException("“填报方角色”和“交易对手方角色”:必须对立"); } if (req.IsUsePerformanceColl != "是") { req.PerformanceExplain = ""; } var trans = DbContext.Database.BeginTransaction(); var dbModel = DbContext.trade_Report.Where(x => x.TradeId == req.TradeId).FirstOrDefault(); if (dbModel == null) { dbModel = new trade_report(); dbModel.TradeId = req.TradeId; DbContext.trade_Report.Add(req); } req.id = dbModel.id; trade.MetaDic = new TradeMetaService(OptUser).GetTradeMeta(trade.id); if (trade.MetaDic.TryGetValue("主协议编号", out string value1)) { dbModel.MainProtocolCode = value1; } if (trade.MetaDic.TryGetValue("补充协议编号", out string value2)) { dbModel.SupProtocolCode = value2; } if (trade.MetaDic.TryGetValue("清算机构", out string value3)) { dbModel.ClearingAgency = value3; } if (trade.MetaDic.TryGetValue("交易场所", out string value4)) { dbModel.TradingPlace = value4; } if (trade.MetaDic.TryGetValue("其他交易场所", out string value5)) { dbModel.OtherTradingPlace = value5; } dbModel.OptId = req.OptId; dbModel.OptName = req.OptName; dbModel.OptDate = req.OptDate; var changes = DataChangeHelper.GetDataChanges(dbModel, req); if (dbModel.MainProtocolCode != req.MainProtocolCode) { AddOrUpdateTradeMeta(false, req.TradeId, "主协议编号", req.MainProtocolCode); changes.Add(new List() { null, "主协议编号", dbModel.MainProtocolCode, req.MainProtocolCode }); } if (dbModel.SupProtocolCode != req.SupProtocolCode) { AddOrUpdateTradeMeta(false, req.TradeId, "补充协议编号", req.SupProtocolCode); changes.Add(new List() { null, "补充协议编号", dbModel.SupProtocolCode, req.SupProtocolCode }); } if (dbModel.ClearingAgency != req.ClearingAgency) { AddOrUpdateTradeMeta(false, req.TradeId, "清算机构", req.ClearingAgency); changes.Add(new List() { null, "清算机构", dbModel.ClearingAgency, req.ClearingAgency }); } if (dbModel.TradingPlace != req.TradingPlace) { AddOrUpdateTradeMeta(false, req.TradeId, "交易场所", req.TradingPlace); changes.Add(new List() { null, "交易场所", dbModel.TradingPlace, req.TradingPlace }); } if (dbModel.OtherTradingPlace != req.OtherTradingPlace) { AddOrUpdateTradeMeta(false, req.TradeId, "其他交易场所", req.OtherTradingPlace); changes.Add(new List() { null, "其他交易场所", dbModel.OtherTradingPlace, req.OtherTradingPlace }); } req.SetOpt(OptUser); ObjectHelper.MapValues(dbModel, req); var tradeauditing = new TradeAuditLog { TradeId = dbModel.TradeId, Changes = changes.ToJson(), DataType = "C02", OptId = UserId, OptName = UserName, OptDate = OptDate, OptType = "修改报送相关字段", AuditFlag = TradeAuditFlag.operation }; //记录审核日志 DbContext.TradeAuditLog.Add(tradeauditing); DbContext.SaveChanges(); //执行事务 trans.Commit(); return dbModel; } private bool CheckTradeReport(trade_report req, out string message) { message = ""; if (string.IsNullOrWhiteSpace(req.MainProtocolCode)) { message = "主协议编号:不能为空"; return true; } if (string.IsNullOrWhiteSpace(req.SupProtocolCode)) { message = "补充协议编号:不能为空"; return true; } if (string.IsNullOrWhiteSpace(req.FillingPartyRole)) { message = "填报方角色:不能为空"; return true; } if (string.IsNullOrWhiteSpace(req.ClearingAgency)) { message = "清算机构:不能为空"; return true; } if (string.IsNullOrWhiteSpace(req.TradingPlace)) { message = "交易场所:不能为空"; return true; } if (req.TradingPlace == "其他交易场所" && string.IsNullOrWhiteSpace(req.OtherTradingPlace)) { message = "交易场所(其他):不能为空"; return true; } if (string.IsNullOrWhiteSpace(req.PerformanceGuarantee)) { message = "履约担保类型:不能为空"; return true; } if (req.PerformanceGuarantee == "部分担保" || req.PerformanceGuarantee == "全额担保") { if (string.IsNullOrWhiteSpace(req.PerformanceCollProvider)) { message = "履约担保品提供方:不能为空"; return true; } if (string.IsNullOrWhiteSpace(req.IsUsePerformanceColl)) { message = "担保品收取方是否可使用担保品:不能为空"; return true; } if (req.IsUsePerformanceColl == "是" && string.IsNullOrWhiteSpace(req.PerformanceExplain)) { message = "担保品使用说明:不能为空"; return true; } if (string.IsNullOrWhiteSpace(req.IsPerformanceCollInterest)) { message = "是否计算担保品价值产生利息:不能为空"; return true; } if ((req.TradeType != "收益互换") && (!req.InitialPerformanceColl.HasValue || req.InitialPerformanceColl < 0)) { message = "履约担保品初始比率(%):必须大于等于0"; return true; } if ((req.TradeType != "收益互换") && (!req.InitialPerformanceCollCash.HasValue || req.InitialPerformanceCollCash < 0)) { message = "履约担保品初始比率(现金部分)(%):必须大于等于0"; return true; } if (!req.RecoveryPerformanceColl.HasValue || req.RecoveryPerformanceColl < 0) { message = "履约担保品追保比率(%):必须大于等于0"; return true; } if (!req.UnwindPerformanceColl.HasValue || req.UnwindPerformanceColl < 0) { message = "履约担保品平仓比率(%):必须大于等于0"; return true; } if ((req.TradeType != "收益互换") && (!req.EodPerformanceColl.HasValue || req.EodPerformanceColl < 0)) { message = "维持担保比率(%):必须大于等于0"; return true; } if (string.IsNullOrWhiteSpace(req.PerformanceCollType)) { message = "履约担保品类型:不能为空"; return true; } if (string.IsNullOrWhiteSpace(req.PerformanceCollRange)) { message = "担保品担保范围:不能为空"; return true; } } if (req.TradeType == "收益互换" && (!req.InitialPerformanceColl.HasValue || req.InitialPerformanceColl < 0)) { message = "履约担保品初始比率(%):必须大于等于0"; return true; } if (req.TradeType == "收益互换" && (!req.EodPerformanceColl.HasValue || req.EodPerformanceColl < 0)) { message = "维持担保比率(%):必须大于等于0"; return true; } return false; } } }