diff --git a/YLErpDAL/Modules/TradeModule/DocGenerateModule/ConfirmationGenerateService.cs b/YLErpDAL/Modules/TradeModule/DocGenerateModule/ConfirmationGenerateService.cs index c7a4e306..e2d4a4df 100644 --- a/YLErpDAL/Modules/TradeModule/DocGenerateModule/ConfirmationGenerateService.cs +++ b/YLErpDAL/Modules/TradeModule/DocGenerateModule/ConfirmationGenerateService.cs @@ -1,4 +1,4 @@ -using NPOI.Util; +using NPOI.Util; using Org.BouncyCastle.Asn1.Ocsp; using System.Text; using YLErp.BLL; @@ -842,105 +842,259 @@ namespace YLErp.Modules.TradeModule.DocGenerateModule } } - public (bool, string, DateTime, string) UploadContractFileNew(string contractCode, bool isCounterpartyDoc, UploadFileModel uploadFileModel) + /// + /// 单笔交易上传确认书。 + /// 会将该 tradeId 对应的旧 trade_contract_r 置为无效,并新增一条有效记录;同时创建/更新 trade_contract_document 并保存上传文件。 + /// + public UploadContractFileNewResult UploadContractFileNew( + int tradeId, + bool useContractCode, + string contractCode, + bool isCounterpartyDoc, + UploadFileModel uploadFileModel) { + var nowDate = DateTime.Now; + if (tradeId <= 0) + { + return new UploadContractFileNewResult { Success = false, Message = "请传入参数", OptDate = nowDate, DocumentPath = string.Empty }; + } + + if (!TryValidateUploadContractFileNew(new[] { tradeId }, uploadFileModel, out _, out var errMsg)) + { + return new UploadContractFileNewResult { Success = false, Message = errMsg, OptDate = nowDate, DocumentPath = string.Empty }; + } try { - var msg = ""; - #region 验证 - if (string.IsNullOrWhiteSpace(contractCode)) - { - - return (false, "请传入参数", DateTime.Now, ""); - } - - var db = DbContextFactory.GetYLDbContext(); - var contractDoc = db.trade_contract_document.FirstOrDefault(d => d.Code == contractCode ); - var contractDocRArr = db.trade_contract_r.Where(O => O.ContractCode == contractDoc.Code && O.Type == contractDoc.Type && O.IsValid).ToArray(); - var contractDocRF = contractDocRArr.FirstOrDefault(); - if (contractDoc == null || contractDocRF == null) + var trade = db.trade.AsNoTracking().FirstOrDefault(t => t.id == tradeId && t.ValidState != "InValid"); + if (trade == null) { - return (false, "没有相关的确认书文档", DateTime.Now, ""); + return new UploadContractFileNewResult { Success = false, Message = "未找到交易数据", OptDate = nowDate, DocumentPath = string.Empty }; } - #endregion - if (uploadFileModel?.Length > 0) + var oldR = db.trade_contract_r + .Where(r => r.TradeId == tradeId && r.Type == ContractTypeEnum.Trade && r.IsValid) + .OrderByDescending(r => r.id) + .FirstOrDefault(); + + var oldCode = (oldR?.ContractCode ?? "").Trim(); + + var activeCode = ""; + if (useContractCode) { - #region 验证 - if (PS.Config.ErpElement.SecuritiesEnvironment) + activeCode = (contractCode ?? "").Trim(); + if (string.IsNullOrWhiteSpace(activeCode)) { - if (System.IO.Path.GetExtension(uploadFileModel.FileName).ToLower() != ".xlsx" - && System.IO.Path.GetExtension(uploadFileModel.FileName).ToLower() != ".xls" - && System.IO.Path.GetExtension(uploadFileModel.FileName).ToLower() != ".pdf" - && System.IO.Path.GetExtension(uploadFileModel.FileName).ToLower() != ".docx" - && System.IO.Path.GetExtension(uploadFileModel.FileName).ToLower() != ".doc") + return new UploadContractFileNewResult { Success = false, Message = "合约编号必填", OptDate = nowDate, DocumentPath = string.Empty }; + } + + if (!string.Equals(oldCode, activeCode, StringComparison.OrdinalIgnoreCase)) + { + var isExists = new TradeContractGenerateService(OptUser).GetExistsContractCode(new[] { activeCode }).Any(); + if (isExists) { - return (false, "请上传PDF/Word/Excel格式的文件", DateTime.Now, ""); + return new UploadContractFileNewResult { Success = false, Message = "合约编号已存在", OptDate = nowDate, DocumentPath = string.Empty }; } } - if (PS.Config.ErpElement.SecuritiesEnvironment && uploadFileModel.Length > Modules.SuperviseReportModule.SAC.Model.ReportStatusModel.MaxAnnexLength)//小于30MB - { - return (false, "上传失败,单笔确认书文件大小不应超过30MB", DateTime.Now, ""); - } - #endregion - - var tradeNumber = "未知"; - if (contractDocRF != null) - { - tradeNumber = contractDocRF.TradeNumber; - } - var filePath = Path.Combine(OtcAppContext.AppDocsPath, "contractdoc", "output"); - - if (!Directory.Exists(filePath)) - { - Directory.CreateDirectory(filePath); - } - - var stampFileFullName = Path.Combine(filePath, uploadFileModel.FileName); - contractDoc.Paths = stampFileFullName.Replace(OtcAppContext.AppDocsPath, "/App_Docs").Replace("\\", "/"); - contractDoc.FileName = uploadFileModel.FileName; - if (File.Exists(stampFileFullName)) - { - File.Delete(stampFileFullName); - } - - using var fs = new FileStream(stampFileFullName, FileMode.Create, FileAccess.ReadWrite); - - using var sr = uploadFileModel.OpenReadStream(); - - sr.Seek(0, SeekOrigin.Begin); - var tempBytes = new byte[sr.Length]; - sr.Read(tempBytes, 0, tempBytes.Length); - fs.Write(tempBytes, 0, tempBytes.Length); - - sr.Close(); - - fs.Close(); - msg = msg.Length > 0 ? msg : "上传成功"; } - - #region 更新数据 - contractDoc.SourceType = isCounterpartyDoc ? 2 : 1; // 对方用印文件=人工上传,否则=系统生成 - var confrimService = new TradeConfirmService(OptUser, db); - foreach (var contractDocR in contractDocRArr) + else { - new TradeConfirmService(OptUser, db).EditReportStatus(contractDocR.TradeId, true); + if (!string.IsNullOrWhiteSpace(oldCode)) + { + activeCode = oldCode; + } + else + { + var client = DataCacheProvider.GetClientDataSource().GetData(trade.ClientId); + if (string.IsNullOrEmpty(client?.Code)) + { + return new UploadContractFileNewResult { Success = false, Message = "对手方代码缩写缺失,请联系运营组同事维护", OptDate = nowDate, DocumentPath = string.Empty }; + } + activeCode = GenerateContractCodeForTrade(db, trade, client?.Code); + } } - db.SaveChanges(); - #endregion + if (string.IsNullOrWhiteSpace(activeCode)) + { + return new UploadContractFileNewResult { Success = false, Message = "合约编号生成失败", OptDate = nowDate, DocumentPath = string.Empty }; + } - return (true, msg, contractDoc.OptDate.Value, contractDoc.StampDocumentFileName); + trade_contract_document oldDoc = null; + if (!string.IsNullOrWhiteSpace(oldCode)) + { + oldDoc = db.trade_contract_document.FirstOrDefault(d => d.Code == oldCode && d.Type == ContractTypeEnum.Trade); + } + + var oldValidRs = new List(); + if (oldR != null) + { + oldValidRs.Add(oldR); + oldR.IsValid = false; + oldR.OptDate = nowDate; + oldR.OptId = OptUser.UserId; + oldR.OptName = OptUser.UserName; + } + + var newDoc = new trade_contract_document(); + db.trade_contract_document.Add(newDoc); + + if (oldDoc != null) + { + newDoc.ValueDate = oldDoc.ValueDate; + newDoc.BuyerId = oldDoc.BuyerId; + newDoc.BuyerName = oldDoc.BuyerName; + newDoc.SellerId = oldDoc.SellerId; + newDoc.SellerName = oldDoc.SellerName; + newDoc.ContractVersion = oldDoc.ContractVersion; + newDoc.FileType = oldDoc.FileType; + newDoc.DayNumber = oldDoc.DayNumber; + newDoc.ClientId = oldDoc.ClientId; + newDoc.Comments = oldDoc.Comments; + db.trade_contract_document.Remove(oldDoc); + } + else + { + var isGJBuyer = trade.BuySell == "买入"; + newDoc.ValueDate = valuedateBLL.ValueDate; + newDoc.BuyerId = isGJBuyer ? 0 : trade.ClientId; + newDoc.BuyerName = isGJBuyer ? (PS.Config.CompanyName ?? "") : trade.ClientName; + newDoc.SellerId = isGJBuyer ? trade.ClientId : 0; + newDoc.SellerName = isGJBuyer ? trade.ClientName : (PS.Config.CompanyName ?? ""); + newDoc.ClientId = trade.ClientId; + } + + newDoc.Code = activeCode; + newDoc.Status = ContractStatusEnum.Draft; + newDoc.SourceType = isCounterpartyDoc ? 2 : 1; + newDoc.Type = ContractTypeEnum.Trade; + newDoc.OptId = OptUser.UserId; + newDoc.OptName = OptUser.UserName; + newDoc.OptDate = nowDate; + + SaveUploadFile(activeCode, uploadFileModel, out var outputRelativeDir); + newDoc.Paths = outputRelativeDir; + newDoc.FileName = uploadFileModel.FileName; + + var newR = new trade_contract_r(); + db.trade_contract_r.Add(newR); + newR.TradeId = tradeId; + newR.TradeNumber = trade.TradeNumber; + newR.ContractCode = activeCode; + newR.TradeClearCode = activeCode; + newR.Type = ContractTypeEnum.Trade; + newR.IsValid = true; + newR.OptId = OptUser.UserId; + newR.OptName = OptUser.UserName; + newR.OptDate = nowDate; + + new TradeConfirmService(OptUser, db).EditReportStatus(tradeId, true); + db.SaveChanges(); + + return new UploadContractFileNewResult + { + Success = true, + Message = "上传成功", + OptDate = newDoc.OptDate ?? nowDate, + DocumentPath = newDoc.RelativePath + }; } catch (Exception ex) { LogFactory.GetLogger("UploadContractFileNew").Error("UploadContractFileNew出错", ex); - return (false, "操作出错", DateTime.Now, ""); + return new UploadContractFileNewResult { Success = false, Message = "操作出错", OptDate = nowDate, DocumentPath = string.Empty }; } } + /// + /// 生成合约编号逻辑:如果是收益互换交易,使用国联的生成规则;否则默认使用 TradeNumber 作为合约编号。 + /// + /// + /// + /// + /// + private string GenerateContractCodeForTrade(YLContext db, trade trade,string clientCode) + { + if (trade.TradeType == "收益互换") + { + return GuolianContractNoGenerator.Generate(db, trade, clientCode ?? ""); + } + return trade.TradeNumber; + } + + private static bool TryValidateUploadContractFileNew( + IReadOnlyCollection tradeIds, + UploadFileModel uploadFileModel, + out HashSet tradeIdSet, + out string errMsg) + { + tradeIdSet = new HashSet(); + errMsg = null; + + if (tradeIds == null || tradeIds.Count == 0) + { + errMsg = "请传入参数"; + return false; + } + + if (uploadFileModel == null || uploadFileModel.Length <= 0) + { + errMsg = "请选择需上传的文件"; + return false; + } + + var fileExt = System.IO.Path.GetExtension(uploadFileModel.FileName)?.ToLowerInvariant(); + if (fileExt != ".xlsx" && fileExt != ".xls" && fileExt != ".pdf" && fileExt != ".docx" && fileExt != ".doc") + { + errMsg = "请上传PDF/Word/Excel格式的文件"; + return false; + } + + foreach (var tid in tradeIds) + { + if (tid > 0) + { + tradeIdSet.Add(tid); + } + } + if (tradeIdSet.Count == 0) + { + errMsg = "请传入参数"; + return false; + } + + return true; + } + /// + /// 保存上传的文件到服务器,并返回相对路径和文件名 + /// + /// + /// + /// + /// + private static void SaveUploadFile(string contractCode, UploadFileModel uploadFileModel, out string outputRelativeDir) + { + var outputDir = Path.Combine(OtcAppContext.AppDocsPath, "contractdoc", "output"); + if (!Directory.Exists(outputDir)) + { + Directory.CreateDirectory(outputDir); + } + var ext = Path.GetExtension(uploadFileModel.FileName) ?? ""; + + var outputFullPath = Path.Combine(outputDir, uploadFileModel.FileName); + if (File.Exists(outputFullPath)) + { + File.Delete(outputFullPath); + } + + using (var fs = new FileStream(outputFullPath, FileMode.Create, FileAccess.Write, FileShare.None)) + using (var sr = uploadFileModel.OpenReadStream()) + { + sr.CopyTo(fs); + } + + outputRelativeDir = Path.Combine("App_Docs", "contractdoc", "output"); + } public string GetSealErrMsg(string code) diff --git a/YLErpDAL/Modules/TradeModule/DocGenerateModule/UploadContractFileNewResult.cs b/YLErpDAL/Modules/TradeModule/DocGenerateModule/UploadContractFileNewResult.cs new file mode 100644 index 00000000..95da9835 --- /dev/null +++ b/YLErpDAL/Modules/TradeModule/DocGenerateModule/UploadContractFileNewResult.cs @@ -0,0 +1,12 @@ +using System; + +namespace YLErp.Modules.TradeModule.DocGenerateModule +{ + public sealed class UploadContractFileNewResult + { + public bool Success { get; set; } + public string Message { get; set; } + public DateTime OptDate { get; set; } + public string DocumentPath { get; set; } + } +} diff --git a/YLErpWeb/Controllers/TradeConfirmBookController.cs b/YLErpWeb/Controllers/TradeConfirmBookController.cs index eace6701..14c0470d 100644 --- a/YLErpWeb/Controllers/TradeConfirmBookController.cs +++ b/YLErpWeb/Controllers/TradeConfirmBookController.cs @@ -782,9 +782,9 @@ namespace YLErp.Web.Controllers /// /// 将上传确认书做成页面 /// - public ActionResult confirmBookUploadNew(string Id) + public ActionResult confirmBookUploadNew(int tradeId = 0) { - ViewBag.Id = Id; + ViewBag.TradeId = tradeId; return View(); } @@ -2631,4 +2631,4 @@ namespace YLErp.Web.Controllers } } } -} \ No newline at end of file +} diff --git a/YLErpWeb/Controllers/tradeController.cs b/YLErpWeb/Controllers/tradeController.cs index 990c31ee..0624d5ad 100644 --- a/YLErpWeb/Controllers/tradeController.cs +++ b/YLErpWeb/Controllers/tradeController.cs @@ -2032,22 +2032,16 @@ namespace YLErp.Web.Controllers } return JsonError(msg); } - public ActionResult UploadContractFileNew(string encryptId, bool isCounterpartyDoc = false) - { + public ActionResult UploadContractFileNew(int tradeId, bool isCounterpartyDoc = false, bool useContractCode = false, string contractCode = null) + { var uploadFileModel = Request.Form.Files.Count > 0 ? Request.Form.Files[0].ToUploadFileModel() : null; - var docId = DataProtectHelper.DecryptInt(encryptId); - var contractDoc = db.trade_contract_document.FirstOrDefault(o => o.id == docId); - if (contractDoc == null) - { - return JsonError("未找到确认书数据"); - } - var (flag, msg, optDate, stampPath) = new ConfirmationGenerateService(CurUser).UploadContractFileNew(contractDoc.Code, isCounterpartyDoc, uploadFileModel); - if (flag) + var result = new ConfirmationGenerateService(CurUser).UploadContractFileNew(tradeId, useContractCode, contractCode, isCounterpartyDoc, uploadFileModel); + if (result.Success) { - return JsonSuccess(msg); + return JsonSuccess(result.Message); } - return JsonError(msg); + return JsonError(result.Message); } public ActionResult tradeContractManagementQuery(string tradeNumber) @@ -8967,4 +8961,4 @@ namespace YLErp.Web.Controllers #endregion } -} \ No newline at end of file +} diff --git a/YLErpWeb/Views/TradeConfirmBook/confirmBookUploadNew.cshtml b/YLErpWeb/Views/TradeConfirmBook/confirmBookUploadNew.cshtml index f30dd95e..5f022100 100644 --- a/YLErpWeb/Views/TradeConfirmBook/confirmBookUploadNew.cshtml +++ b/YLErpWeb/Views/TradeConfirmBook/confirmBookUploadNew.cshtml @@ -1,11 +1,10 @@ -@{ +@{ ViewBag.Title = "confirmBookUploadNew"; Layout = "~/Views/Shared/_InfoLayout.cshtml"; var pageObj = new { - Id = ViewBag.Id, - SendMailId = ViewBag.SendMailId + TradeId = ViewBag.TradeId }; } @@ -23,26 +22,34 @@ var page = @Json.Serialize(pageObj); function UploadFiles1() { - if (main.isEmpty(page.Id)) { - main.message("还未生成确认书,无法上传"); + var tradeId = page.TradeId; + + if (main.isEmpty(tradeId)) { + main.message("缺少交易参数,无法上传"); return; } - //alert(tradeNumber); - var encryptId = page.Id; var files = $("#openFile")[0].files; if (files.length <= 0) { main.message("请选择需上传的文件"); return; } - var description = $("#fileDescription").val(); + var useContractCode = $("#useContractCode").is(':checked'); + var contractCode = $("#contractCode").val(); + + if (useContractCode && main.isEmpty(contractCode)) { + main.message("合约编号必填"); + return; + } var data = new FormData(); for (var x = 0; x < files.length; x++) { data.append(files[x].name, files[x]); } - data.append("encryptId", encryptId); + data.append("tradeId", tradeId); data.append("isCounterpartyDoc", $("#isCounterpartyDoc").is(':checked')); + data.append("useContractCode", useContractCode); + data.append("contractCode", contractCode); $.ajax({ type: "Post", @@ -67,6 +74,19 @@ } }); } + + function toggleContractCode() { + var useContractCode = $("#useContractCode").is(':checked'); + $("#contractCode").prop("disabled", !useContractCode); + if (!useContractCode) { + $("#contractCode").val(""); + } + } + + $(function () { + $("#useContractCode").on("change", toggleContractCode); + toggleContractCode(); + }); }
@@ -74,6 +94,13 @@
+
+ +
+ + +
+
@@ -87,4 +114,4 @@ 取消
- \ No newline at end of file + diff --git a/YLErpWeb/wwwroot/Scripts/app/trade/tradeConfirmBook.js b/YLErpWeb/wwwroot/Scripts/app/trade/tradeConfirmBook.js index 9d54a593..e0acfadb 100644 --- a/YLErpWeb/wwwroot/Scripts/app/trade/tradeConfirmBook.js +++ b/YLErpWeb/wwwroot/Scripts/app/trade/tradeConfirmBook.js @@ -1,4 +1,4 @@ -var valuedate = page.valuedate; +var valuedate = page.valuedate; var ContractTypeCtrl; var ReportId; @@ -354,8 +354,8 @@ const colModelGrid = (new function () { end: function () { SearchClick(true) } }); } - this.uploadNew = function (encryptId) { - var srcurl = "/TradeConfirmBook/confirmBookUploadNew/?Id=" + encryptId; + this.uploadNew = function (tradeId) { + var srcurl = "/TradeConfirmBook/confirmBookUploadNew/?tradeId=" + tradeId; main.open("上传确认书", srcurl, { area: ['500px', '420px'], end: function () { SearchClick(true) } @@ -935,8 +935,8 @@ function showToolName(cellValue, options, rowObject) { html += "" .template(rowObject.EncryptId, "发送Email"); } - var canUpload = page.canGenerate == true ? "" : "disabled"; - html += "".template(rowObject.MetaDic.ContractEncryptId, canUpload); + html += "" + .template(rowObject.id); html += "".template(rowObject.id); return html; } @@ -1321,4 +1321,4 @@ function submitOA(id) { }).fail(function (xhr, status, error) { SearchClick(true); }); -} \ No newline at end of file +} diff --git a/YLErpWeb/wwwroot/Scripts/app/trade/tradeConfirmBookListByClient.js b/YLErpWeb/wwwroot/Scripts/app/trade/tradeConfirmBookListByClient.js index 18035f3b..15a4e26b 100644 --- a/YLErpWeb/wwwroot/Scripts/app/trade/tradeConfirmBookListByClient.js +++ b/YLErpWeb/wwwroot/Scripts/app/trade/tradeConfirmBookListByClient.js @@ -56,8 +56,8 @@ const colModelGrid = (new function () { end: function () { SearchClick(true) } }); } - this.uploadNew = function (encryptId) { - var srcurl = "/TradeConfirmBook/confirmBookUploadNew/?Id=" + encryptId; + this.uploadNew = function (tradeId) { + var srcurl = "/TradeConfirmBook/confirmBookUploadNew/?tradeId=" + tradeId; main.open("上传确认书", srcurl, { area: ['500px', '420px'], end: function () { SearchClick(true) } @@ -256,7 +256,8 @@ function showToolName(cellValue, options, rowObject) { .template(rowObject.EncryptId, "发送Email"); } var canUpload = page.canGenerate == true && rowObject.ContractDocUrl ? "" : "disabled"; - html += "".template(rowObject.ContractCode, canUpload); + html += "" + .template(rowObject.tradeIds && rowObject.tradeIds.length > 0 ? rowObject.tradeIds[0] : 0, canUpload); return html; }