从山证v2.3.0拷贝
This commit is contained in:
@@ -0,0 +1,498 @@
|
||||
using YLErp.BLL;
|
||||
using YLErp.BLL.MarginCalculation;
|
||||
using YLErp.DBModels.Consts;
|
||||
using YLErp.Model;
|
||||
using YLErp.Models;
|
||||
using YLErp.Modules.DataProviderModule;
|
||||
using YLErp.Modules.TradeDalModule;
|
||||
using YLErp.MsOffice;
|
||||
using YLErp.Office;
|
||||
using YLErp.Office.Converters;
|
||||
using YLErp.Plugins.TradeDocGenerator.Abstracts;
|
||||
|
||||
namespace YLErp.Modules.TradeModule.DocGenerateModule
|
||||
{
|
||||
/// <summary>
|
||||
/// 生成结算确认书
|
||||
/// </summary>
|
||||
public class UnwindReportGenerateService : YLBaseService
|
||||
{
|
||||
public UnwindReportGenerateService(OptUserInfo userInfo) : base(userInfo)
|
||||
{
|
||||
}
|
||||
|
||||
public UnwindReportGenerateService(YLBaseService baseService) : base(baseService)
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 生成结算确认书
|
||||
/// </summary>
|
||||
public IEnumerable<TradeDocGenerateResult> Generate(IEnumerable<UnwindReportInputModel> unwindReportInputModels, string docType)
|
||||
{
|
||||
if (unwindReportInputModels == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(unwindReportInputModels));
|
||||
}
|
||||
|
||||
if (docType == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(docType));
|
||||
}
|
||||
|
||||
var tradeIds = unwindReportInputModels.Select(m => m.TradeId).ToHashSet();
|
||||
var tradeCashIds = unwindReportInputModels.Select(m => m.TradeCashId).ToHashSet();
|
||||
//当前交易日
|
||||
var valueDate = valuedateBLL.ValueDate;
|
||||
var tradeCashStatus = new string[] { ClientCashInCashOut.系统操作_行权费, ClientCashInCashOut.系统操作_平仓费 };
|
||||
|
||||
//----------------------------------
|
||||
// 获取当日行权 平仓 到期的有效交易
|
||||
//----------------------------------
|
||||
var service = new TradeDalService(this);
|
||||
|
||||
IEnumerable<trade> tradeQuery;
|
||||
|
||||
if (PS.Config.TradeElement.IsSingleExecutionTemplate)
|
||||
{
|
||||
tradeQuery = service.GetTradeOrEodTrade(tradeIds, valueDate)
|
||||
.Where(O => (O.TradeStatus == ConsTrade.已平仓 || O.TradeType == "累计期权" || O.UnWindNotional > 0) && O.ClientId > 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
tradeQuery = service.GetTradeOrEodTrade(tradeIds, valueDate)
|
||||
.Where(O => (O.TradeStatus == ConsTrade.已平仓 || O.UnWindNotional > 0 || O.TradeType == "累计期权" || (O.TradeStatus == ConsTrade.已执行 && O.ExerciseMode == "American")) && O.ClientId > 0);
|
||||
}
|
||||
|
||||
if (PS.Config.Is长江)
|
||||
{
|
||||
foreach (var td in tradeQuery)
|
||||
{
|
||||
if (td.StructureType != "牛市价差" && td.StructureType != "熊市价差")
|
||||
{
|
||||
td.ParentTradeId = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//使用Action等于票息并且IsLastAction检索数据,逻辑是存在问题的,敲出平仓+票息是没问题的, 到期+票息应该会取出多条,需要梳理逻辑后调整
|
||||
|
||||
var tcPredicate = PredicateBuilder.Create<trade_cash>(tc =>
|
||||
tc.ValidState != ConsGlobal.InValid && !tc.IsDeleted && tradeCashIds.Contains(tc.id) && tradeIds.Contains(tc.TradeId)
|
||||
&& (tradeCashStatus.Contains(tc.Action) && tc.ExerciseWay == TradeCashExerciseWayEnum.提前终止行权 || tc.Action == ClientCashInCashOut.系统操作_票息 && tc.IsLastAction));
|
||||
|
||||
var tcQuery = DbContext.trade_cash.Where(tcPredicate);
|
||||
|
||||
var tids2 = tradeQuery.Select(n => n.ParentTradeId > 0 ? n.ParentTradeId : n.id).ToHashSet();
|
||||
|
||||
var trQuery = from cr in DbContext.trade_contract_r
|
||||
join cd in DbContext.trade_contract_document on cr.ContractCode equals cd.Code
|
||||
where cr.Type == ContractTypeEnum.Trade && cr.IsValid && (cd.Type == ContractTypeEnum.Clearing)
|
||||
&& tids2.Contains(cr.TradeId)
|
||||
select new { cr.TradeId, cr, cd };
|
||||
|
||||
var query = from td in tradeQuery
|
||||
join tc in tcQuery on td.id equals tc.TradeId
|
||||
join tr in trQuery on new { id = td.ParentTradeId > 0 ? td.ParentTradeId : td.id } equals new { id = tr.TradeId } into trs
|
||||
from tr in trs.DefaultIfEmpty()
|
||||
select new trade_contract_group
|
||||
{
|
||||
id = tc.id,
|
||||
trade = td,
|
||||
trade_cash = tc,
|
||||
ConfirmContractR = tr == null ? null : tr.cr,
|
||||
trade_contract_document = tr == null ? null : tr.cd,
|
||||
UnwindVol = tc.Action == ClientCashInCashOut.系统操作_平仓费 ? tc.UnwindVol : null
|
||||
};
|
||||
|
||||
var queryList = query.ToArray();
|
||||
|
||||
if (!queryList.Any())
|
||||
{
|
||||
throw new ServiceException("当日没有要结算的记录信息!");
|
||||
}
|
||||
|
||||
//----------------------------------
|
||||
// 生成交易结算书
|
||||
//----------------------------------
|
||||
var resultList = new List<TradeDocGenerateResult>();
|
||||
AppManager.TryResolve(out ITradeUnwindReportGenerator generatorV2);
|
||||
var querySet = queryList.Select(n => n.trade.id + n.trade_cash.ExerciseWay).ToHashSet();
|
||||
var cacheList = new List<string>();
|
||||
//客户编号列表
|
||||
foreach (var tradeContractGroup in queryList)
|
||||
{
|
||||
if (tradeContractGroup.trade_cash.ExerciseWay == ClientCashInCashOut.系统操作_票息
|
||||
&& querySet.Contains(tradeContractGroup.trade.id + TradeCashExerciseWayEnum.提前终止行权))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (tradeContractGroup.trade.ParentTradeId != 0)
|
||||
{
|
||||
var structureTrades = service.GetTradeOrEodTradeOfTidAPid(new[] { tradeContractGroup.trade.ParentTradeId }, valueDate);
|
||||
if (YLErp.PS.Config.Is光大光子 || YLErp.PS.Config.Is兴业商贸 || YLErp.PS.Config.Is方顿)
|
||||
{
|
||||
structureTrades.RemoveAll(x => x.ParentTradeId != 0 && !tradeIds.Contains(x.id));
|
||||
}
|
||||
var subTradeDict = structureTrades.Where(O => O.ParentTradeId == tradeContractGroup.trade.ParentTradeId).GroupBy(O => O.TradeStatus).ToDictionary(K => K.Key, V => V.ToList());
|
||||
if (subTradeDict.Count == 1)
|
||||
{
|
||||
var subTradeIds = subTradeDict.First().Value.Select(O => O.id).ToList();
|
||||
var tradeCashes = (from cash in DbContext.trade_cash
|
||||
where subTradeIds.Contains(cash.TradeId) && !cash.IsDeleted
|
||||
&& cash.Action == tradeContractGroup.trade_cash.Action
|
||||
&& cash.ValueDate == tradeContractGroup.trade_cash.ValueDate
|
||||
&& cash.ExerciseWay == tradeContractGroup.trade_cash.ExerciseWay
|
||||
&& cash.Notional == tradeContractGroup.trade_cash.Notional
|
||||
&& cash.UnwindNotional == tradeContractGroup.trade_cash.UnwindNotional
|
||||
select cash)
|
||||
.ToList();
|
||||
if (tradeCashes.Count == subTradeDict.First().Value.Count)
|
||||
{
|
||||
subTradeDict.First().Value.ForEach(O => O.trade_cash = tradeCashes.First(B => B.TradeId == O.id));
|
||||
tradeContractGroup.trade = structureTrades.Where(O => !subTradeIds.Contains(O.id)).First();
|
||||
tradeContractGroup.trade.SubTrades = structureTrades.Where(O => subTradeIds.Contains(O.id)).ToList();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (tradeContractGroup.trade.TradeType == "结构化交易")
|
||||
{
|
||||
if (tradeContractGroup.trade.IsGroup == 1)
|
||||
{
|
||||
tradeContractGroup.trade.SubTrades = DbContext.trade.Where(O => O.ParentTradeId == tradeContractGroup.trade.id).ToList();
|
||||
foreach (var subtc in tradeContractGroup.trade.SubTrades)
|
||||
{
|
||||
subtc.trade_cash = DbContext.trade_cash.FirstOrDefault(tc =>
|
||||
tc.ValidState != ConsGlobal.InValid && !tc.IsDeleted && tc.TradeId == subtc.id
|
||||
&& (tradeCashStatus.Contains(tc.Action) && tc.ExerciseWay == TradeCashExerciseWayEnum.提前终止行权 || tc.Action == ClientCashInCashOut.系统操作_票息 && tc.IsLastAction));
|
||||
}
|
||||
}
|
||||
}
|
||||
tradeContractGroup.trade.trade_cash = tradeContractGroup.trade_cash;
|
||||
|
||||
if ((tradeContractGroup.trade.TradeType != "结构化交易" && tradeContractGroup.trade_cash == null)
|
||||
|| (tradeContractGroup.trade.TradeType == "结构化交易" && tradeContractGroup.trade.IsGroup == 0 && tradeContractGroup.trade.SubTrades.Any(O => O.trade_cash == null)))
|
||||
{
|
||||
resultList.Add(new TradeDocGenerateResult(tradeContractGroup.trade)
|
||||
{
|
||||
ErrorMessage = "缺少现金交割记录"
|
||||
});
|
||||
}
|
||||
else if (generatorV2 != null)
|
||||
{
|
||||
var key = $"{tradeContractGroup.trade.id}_{tradeContractGroup.trade_cash.Action}_{tradeContractGroup.trade_cash.Notional}_{tradeContractGroup.trade_cash.UnwindNotional}";
|
||||
if (cacheList.Contains(key))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
cacheList.Add(key);
|
||||
if (PS.Config.Company == Configuration.CompanyEnum.兴业商贸 && !DbContext.trade_contract_r.Any(x => tradeContractGroup.trade.id == x.TradeId && x.Type == ContractTypeEnum.Trade && x.IsValid))
|
||||
{
|
||||
resultList.Add(new TradeDocGenerateResult(tradeContractGroup.trade)
|
||||
{
|
||||
ErrorMessage = "请先生成对应的交易确认书!"
|
||||
});
|
||||
}
|
||||
var result = GenerateSingleV2(generatorV2, tradeContractGroup, tradeContractGroup.trade_cash.id, docType);
|
||||
if (PS.Config.Is方顿)
|
||||
{
|
||||
if (resultList.Where(x => x.OutputFilePath == result.OutputFilePath).Count() > 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
resultList.Add(result);
|
||||
}
|
||||
else
|
||||
{
|
||||
var result = GenerateSingleV1(tradeContractGroup, docType);
|
||||
resultList.Add(result);
|
||||
}
|
||||
}
|
||||
|
||||
return resultList;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
private TradeDocGenerateResult GenerateSingleV2(ITradeUnwindReportGenerator generator, trade_contract_group tradeContractGroup, int tradeCashId, string docType = "DOCX")
|
||||
{
|
||||
try
|
||||
{
|
||||
var context = new UnwindReportGenerateContext(tradeCashId, tradeContractGroup.trade, ContractTypeEnum.UnWind, OptUser);
|
||||
generator.Initialize(docType, context);
|
||||
return generator.GenerateDocument();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogFactory.GetLogger<UnwindReportGenerateService>().Error("GenerateSingleV2", ex);
|
||||
|
||||
return new TradeDocGenerateResult(tradeContractGroup.trade)
|
||||
{
|
||||
ErrorMessage = "出错:" + ex.Message
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
private TradeDocGenerateResult GenerateSingleV1(trade_contract_group contractGroup, string docType = "DOCX")
|
||||
{
|
||||
if (contractGroup == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(contractGroup));
|
||||
}
|
||||
|
||||
var contractBLL = new TradeContractBLL(this);
|
||||
var dic = new Dictionary<string, object>();
|
||||
var trade = contractGroup.trade;
|
||||
var tradeCash = contractGroup.trade_cash;
|
||||
var contractDoc = contractGroup.trade_contract_document;
|
||||
var needAddData = true;
|
||||
|
||||
#region 如果提前终止确认书已经生成过,则直接返回
|
||||
|
||||
var unWindDoc = contractBLL.GetContractDoc(trade.id, ContractTypeEnum.UnWind, tradeCash.id);
|
||||
if (unWindDoc != null)
|
||||
{
|
||||
if (File.Exists(unWindDoc.AbsolutePath))
|
||||
{
|
||||
if (docType == "PDF")
|
||||
{
|
||||
var pdfPath = unWindDoc.AbsolutePath.Replace(".docx", ".pdf");
|
||||
if (!File.Exists(pdfPath))
|
||||
{
|
||||
OfficeFileConverter.ConvertDocxToPDF(unWindDoc.AbsolutePath, pdfPath);
|
||||
}
|
||||
|
||||
return new TradeDocGenerateResult(trade)
|
||||
{
|
||||
OutputFilePath = $"../App_Docs/GTJA/{unWindDoc.FileName.Replace(".docx", ".pdf")}"
|
||||
};
|
||||
}
|
||||
|
||||
return new TradeDocGenerateResult(trade)
|
||||
{
|
||||
OutputFilePath = $"../App_Docs/GTJA/{unWindDoc.FileName}"
|
||||
};
|
||||
}
|
||||
else
|
||||
{
|
||||
needAddData = false;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
var isGJBuyer = trade.BuySell == "买入";
|
||||
|
||||
var underlying = DataCacheProvider.GetUnderlyingDataSource().GetData(trade.UnderlyingCode);
|
||||
if (underlying == null)
|
||||
{
|
||||
return new TradeDocGenerateResult(trade)
|
||||
{
|
||||
ErrorMessage = $"标的资产{trade.UnderlyingCode}信息未找到"
|
||||
};
|
||||
}
|
||||
var client = ClientModule.ClientDataQueryService.GetClient(trade.ClientId);
|
||||
if (client == null)
|
||||
{
|
||||
return new TradeDocGenerateResult(trade)
|
||||
{
|
||||
ErrorMessage = $"客户(id:{trade.ClientId})信息未找到"
|
||||
};
|
||||
}
|
||||
|
||||
dic["{{乙方名称}}"] = client.Name;
|
||||
|
||||
if (isGJBuyer)
|
||||
{
|
||||
dic["{{甲方方向}}"] = "买方";
|
||||
dic["{{乙方方向}}"] = "卖方";
|
||||
}
|
||||
else
|
||||
{
|
||||
dic["{{甲方方向}}"] = "卖方";
|
||||
dic["{{乙方方向}}"] = "买方";
|
||||
}
|
||||
|
||||
var tradeType = trade.TradeType == "香草期权" ? "普通" : (trade.TradeType == "结构化交易" ? trade.StructureType : trade.TradeType.Replace("期权", ""));
|
||||
dic["{{期权类型}}"] = $"{trade.ExerciseModeCn}{tradeType}{trade.OptionType}期权";
|
||||
|
||||
var variety = VarietyBLL.GetAllvarietyModel().FirstOrDefault(x => x.id == underlying.UnderlyingTypeId);
|
||||
if (trade.TradeType == "合成价差期权")
|
||||
{
|
||||
dic["{{商品标的名称}}"] = synthetic_underlyingBLL.GetUnderlyingTipsInfo(trade.UnderlyingCode);
|
||||
}
|
||||
else
|
||||
{
|
||||
dic["{{商品标的名称}}"] = trade.UnderlyingCode;
|
||||
}
|
||||
dic["{{交易日}}"] = trade.TradeDate?.ToString("yyyy年M月d日");
|
||||
dic["{{到期日}}"] = trade.ExerciseDate?.ToString("yyyy年M月d日");
|
||||
|
||||
var strUnit = variety.QuoteUnitSingle;
|
||||
var tradeNotional = trade.Notional;
|
||||
var tradeOriginalNotional = (trade.OriginalNotional ?? 0);
|
||||
var unWindCount = trade.TradeStatus == ConsTrade.已平仓 || (trade.UnWindNotional > 0 && tradeCash.UnwindNotional > 0) ? (tradeCash.UnwindNotional).Value : trade.Notional;
|
||||
var unWindCountPercent = (tradeCash.Action == ClientCashInCashOut.系统操作_平仓费 ? (tradeCash.UnwindPercentRate ?? 0) : (trade.Notional / trade.OriginalNotional) ?? 0).OtcFormatNotional(isPercent: true);
|
||||
var unWindPricePercent = (tradeCash.UnwindPricePercentRate ?? 0).OtcFormat(OtcFormatFlag.premiumRateP);
|
||||
|
||||
dic["{{执行价格}}"] = $"{(trade.ActualStrike ?? 0).OtcFormatUmPrice()}元/{strUnit}";
|
||||
dic["{{期权价格}}"] = $"{(trade.TradeSinglePrice ?? 0).OtcFormatMoney(grouping: false)}元/{strUnit}";
|
||||
dic["{{商品标的数量}}"] = $"{tradeOriginalNotional.OtcFormatNotional()}{strUnit}";
|
||||
dic["{{名义本金}}"] = $"{(trade.OriginalStockEqvNotional ?? 0).OtcFormat(OtcFormatFlag.StockEqvNotional)}";
|
||||
dic["{{期权费率}}"] = $"{(trade.PremiumRate ?? 0).OtcFormat(OtcFormatFlag.premiumRateP)}";
|
||||
dic["{{支付时间}}"] = "提前终止/到期时支付";
|
||||
dic["{{终止类型}}"] = tradeCash.Action == ClientCashInCashOut.系统操作_平仓费 ? "平仓" : "美式期权行权";
|
||||
dic["{{终止日}}"] = $"{tradeCash.ValueDate:yyyy年M月d日}";
|
||||
dic["{{终止数量}}"] = trade.IsUsePremiumRate.HasValue && trade.IsUsePremiumRate.Value ? unWindCountPercent : $"{unWindCount.OtcFormatNotional()}{strUnit}";
|
||||
dic["{{标的终止日价格}}"] = $"{(tradeCash.FinalPrice ?? 0).OtcFormatUmPrice()}元/{strUnit}";
|
||||
|
||||
dic["{{期末价格}}"] = $"{(tradeCash.FinalPrice ?? 0).OtcFormatUmPrice()}元/{strUnit}";
|
||||
|
||||
var req = new RunMarginCalculationReq(UserInfo)
|
||||
{
|
||||
tradeList = new List<trade> { trade },
|
||||
settleDate = tradeCash.ValueDate,
|
||||
PriceProvider = new SinglePriceProvider(trade.UnderlyingCode, tradeCash.FinalPrice ?? 0)
|
||||
};
|
||||
if (trade.IsGroup == 1)
|
||||
{
|
||||
req.tradeList = DbContext.trade.Where(x => x.ParentTradeId == trade.id).ToList();
|
||||
}
|
||||
var tradeSpans = MarginDefault.RunMarginCalculation(req);
|
||||
if (tradeSpans?.Count > 0)
|
||||
{
|
||||
var margin = trade.IsGroup == 1 ? tradeSpans.Sum(x => x.WorstCastClientPayable ?? 0) : (tradeSpans[0].WorstCastClientPayable ?? 0);
|
||||
dic["{{预付金}}"] = $"{Math.Abs(margin).OtcFormatMoney()}元";
|
||||
}
|
||||
else
|
||||
{
|
||||
dic["{{预付金}}"] = "0元";
|
||||
}
|
||||
|
||||
dic["{{期权平仓价格}}"] = tradeCash.Action == "系统操作-行权费" || tradeCash.UnwindType == "部分行权" ? "行权收益" : "期权平仓价格";
|
||||
dic["{{平仓价格}}"] = trade.IsUsePremiumRate == true && tradeCash.Action == "系统操作-平仓费" ? unWindPricePercent : $"{Math.Abs(tradeCash.UnwindPrice ?? 0).OtcFormatFlex(2, 4)}元/{strUnit}";
|
||||
dic["{{提前终止款}}"] = $"{tradeCash.Amount.OtcFormatMoney()}元";
|
||||
dic["{{结算价格}}"] = dic["{{平仓价格}}"];
|
||||
|
||||
var premiumFee = trade.OriginalNotional > 0 ? (trade.TradePrice ?? 0) * unWindCount / trade.OriginalNotional.Value : 0;
|
||||
if (isGJBuyer)
|
||||
{
|
||||
var incomes = tradeCash.Amount - premiumFee;
|
||||
dic["{{结算净额}}"] = $"{Math.Abs(incomes).OtcFormatMoney()}元";
|
||||
dic["{{结算方式}}"] = incomes > 0 ? "卖方向买方支付结算净额" : "买方向卖方支付结算净额";
|
||||
dic["{{平仓盈亏}}"] = $"{Math.Abs(incomes).OtcFormatMoney(grouping: false)}元";
|
||||
}
|
||||
else
|
||||
{
|
||||
var incomes = (tradeCash.Amount) + premiumFee;
|
||||
dic["{{结算净额}}"] = $"{Math.Abs(incomes).OtcFormatMoney()}元";
|
||||
dic["{{结算方式}}"] = incomes > 0 ? "买方向卖方支付结算净额" : "卖方向买方支付结算净额";
|
||||
dic["{{平仓盈亏}}"] = $"{Math.Abs(incomes).OtcFormatMoney(grouping: false)}元";
|
||||
}
|
||||
//合同编号
|
||||
string contractNo;
|
||||
string outPutFileName;
|
||||
if (unWindDoc != null)
|
||||
{
|
||||
contractNo = unWindDoc.Code;
|
||||
outPutFileName = unWindDoc.FileName;
|
||||
}
|
||||
else
|
||||
{
|
||||
var contractIndex = contractBLL.GetContractNo("GTJAUnWind");
|
||||
if (PS.Config.CompanyID == "中财资本")
|
||||
{
|
||||
contractNo = $"{trade.TradeNumber} - 01";
|
||||
}
|
||||
else
|
||||
{
|
||||
contractNo = $"{client.Number}C{contractIndex} - 01";
|
||||
}
|
||||
outPutFileName = $"{client.Name}交易确认书C{contractIndex}-01.docx";
|
||||
}
|
||||
dic["{{合同编号}}"] = contractNo;
|
||||
dic["{{确认书编号}}"] = contractDoc == null ? "" : contractDoc.Code;
|
||||
dic["{{确认书时间}}"] = contractDoc == null ? "" : $"{contractDoc.ValueDate.Value:yyyy年M月d日}";
|
||||
|
||||
try
|
||||
{
|
||||
var templateDir = OtcAppContext.MapPath("~/App_Docs/GTJA");
|
||||
var templatePath = OtcAppContext.MapPath("~/App_Docs/导出模板/提前终止确认书模板.doc");
|
||||
if (trade.IsUsePremiumRate.HasValue && trade.IsUsePremiumRate.Value)
|
||||
{
|
||||
templatePath = OtcAppContext.MapPath("~/App_Docs/导出模板/提前终止确认书(名义本金)模板.doc");
|
||||
}
|
||||
|
||||
var outPutFilePath = Path.Combine(templateDir, outPutFileName);
|
||||
|
||||
MsWordTempalteHelper.GenerateFromTemplate(templatePath, dic, outPutFilePath);
|
||||
|
||||
if (docType == "PDF" && !outPutFilePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
MsWordFormatConverter.ConvertToPDF(outPutFilePath, outPutFilePath.Replace(".docx", ".pdf"));
|
||||
}
|
||||
|
||||
//更新操作时间
|
||||
System.IO.File.SetLastAccessTime(outPutFilePath, DateTime.Now);
|
||||
|
||||
#region --- Add trade_contract_document and trade_contract_r records
|
||||
|
||||
if (needAddData)
|
||||
{
|
||||
var nowDate = DateTime.Now;
|
||||
|
||||
var contractRecord = new trade_contract_document();
|
||||
DbContext.trade_contract_document.Add(contractRecord);
|
||||
contractRecord.Code = dic["{{合同编号}}"].ToString();
|
||||
contractRecord.ValueDate = valuedateBLL.ValueDate;
|
||||
contractRecord.BuyerId = isGJBuyer ? 0 : trade.ClientId;
|
||||
contractRecord.BuyerName = isGJBuyer ? PS.Config.CompanyFullName : trade.ClientName;
|
||||
contractRecord.SellerId = isGJBuyer ? trade.ClientId : 0;
|
||||
contractRecord.SellerName = isGJBuyer ? trade.ClientName : PS.Config.CompanyFullName;
|
||||
contractRecord.FileType = FileTypeEnum.Word;
|
||||
contractRecord.Status = ContractStatusEnum.Draft;
|
||||
contractRecord.Paths = $"App_Docs\\GTJA\\{outPutFileName}";
|
||||
contractRecord.FileName = outPutFileName;
|
||||
contractRecord.Type = ContractTypeEnum.UnWind;
|
||||
contractRecord.OptId = UserId;
|
||||
contractRecord.OptName = UserName;
|
||||
contractRecord.OptDate = nowDate;
|
||||
|
||||
var contractTradeRelation = new trade_contract_r();
|
||||
DbContext.trade_contract_r.Add(contractTradeRelation);
|
||||
contractTradeRelation.TradeCashId = tradeCash.id;
|
||||
contractTradeRelation.TradeId = trade.id;
|
||||
contractTradeRelation.TradeNumber = trade.TradeNumber;
|
||||
contractTradeRelation.ContractCode = contractRecord.Code;
|
||||
contractTradeRelation.TradeClearCode = contractRecord.Code;
|
||||
contractTradeRelation.Type = ContractTypeEnum.UnWind;
|
||||
contractTradeRelation.OptId = UserId;
|
||||
contractTradeRelation.OptName = UserName;
|
||||
contractTradeRelation.OptDate = nowDate;
|
||||
contractTradeRelation.IsValid = true;
|
||||
|
||||
DbContext.SaveChanges();
|
||||
}
|
||||
|
||||
#endregion --- Add trade_contract_document and trade_contract_r records
|
||||
|
||||
return new TradeDocGenerateResult(trade)
|
||||
{
|
||||
OutputFilePath = $"/App_Docs/GTJA/{(docType == "PDF" ? outPutFileName.Replace(".docx", ".pdf") : outPutFileName)}"
|
||||
};
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogFactory.GetLogger<UnwindReportGenerateService>().Error("GenerateSingleUnwindReport出错", ex);
|
||||
return new TradeDocGenerateResult(trade)
|
||||
{
|
||||
ErrorMessage = "出错:" + ex.Message
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user