using YLErp.BLL; using YLErp.DBModels.Consts; using YLErp.DBModels.Enums; using YLErp.Modules.SuperviseReportModule.SAC.Common; using YLErp.Modules.SuperviseReportModule.SAC.Model; using static YLErp.DBModels.Consts.ConsReport; namespace YLErp.Modules.SuperviseReportModule.SAC.Service { class ReportPeriodicReportQuarterService : ReportBaseService { public ReportPeriodicReportQuarterService(OptUserInfo optUser) : base(optUser) { } protected override ConsReport.DataFlagsEnum BusiDataType => ConsReport.DataFlagsEnum.A1014; private List? _validOperationType = null; public override List ValidOperationType { get { _validOperationType ??= new List() { OptFlagsEnum.A, OptFlagsEnum.U, OptFlagsEnum.D, }; return _validOperationType; } } string quarter = ""; string fileType = ""; DateTime minDate = DateTime.MinValue; DateTime maxDate = DateTime.MinValue; protected override SuperviseReportTypeEnum ReportType => SuperviseReportTypeEnum.SAC_PeriodicReportQuarter; readonly List noteList = new(); public override bool CheckRequestParamer(ReportInfo req, out string errMsg) { if (!base.CheckRequestParamer(req, out errMsg)) { return false; } if (req.PeriodicReportQuarterDate == null) { errMsg = "季度报告对应的报告季度不应为空"; return false; } SACReportNotes note = null; quarter = GetQuarterRange(req.PeriodicReportQuarterDate.Value, out minDate, out maxDate); fileType = quarter == "05" ? "半年报" : "季度报告"; switch (req.PeriodicReportQuarterStatus) { case OptFlagsEnum.A: var count = tempFilesService.QueryTempFile(minDate, maxDate, fileType).Count(); if (count == 0) { errMsg = $"{minDate.ToString("yyyy-MM-dd")}~{maxDate.ToString("yyyy-MM-dd")}不存在季度报告,请上传后操作"; return false; } note = base.GetReportNotes(ReportType, formatInfoTag(req.PeriodicReportQuarterDate.Value.Year + quarter)).FirstOrDefault(); if (note != null) { errMsg = $"{minDate.ToString("yyyy-MM-dd")}~{maxDate.ToString("yyyy-MM-dd")}最新季度报告记录已报送成功,请选择补正"; return false; } break; case OptFlagsEnum.U: case OptFlagsEnum.D: note = base.GetReportNotes(ReportType, formatInfoTag(req.PeriodicReportQuarterDate.Value.Year + quarter)).FirstOrDefault(); if (note == null) { errMsg = $"{minDate.ToString("yyyy-MM-dd")}~{maxDate.ToString("yyyy-MM-dd")}不存在报送成功的季度报告记录,请重新选择"; return false; } if (req.PeriodicReportQuarterStatus == OptFlagsEnum.U) { var fileIds = tempFilesService.QueryTempFile(minDate, maxDate, fileType).Select(O => O.id.ToString()).ToArray(); var fileIdArr = note.DataId.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); if (!fileIds.Except(fileIdArr).Any()) { errMsg = $"{minDate.ToString("yyyy-MM-dd")}~{maxDate.ToString("yyyy-MM-dd")}已上传季度报告附件都已报送,不需要再次报送"; return false; } } break; default: break; } errMsg = ""; return true; } protected override BodyModel GenerateBody(out bool noData, out List fileList) { fileList = new List(); noData = true; var model = new BodyModel(); var cacheValue = formatInfoTag(_reqInfo.PeriodicReportQuarterDate.Value.Year + quarter); if (ReportStatus.CheckCacheInfo(CacheKey, cacheValue)) { return model; } model.PeriodicReportQuarter = new PeriodicReportQuarterModel(); var note = base.GetReportNotes(ReportType, cacheValue).FirstOrDefault(); if (note == null) { note = new SACReportNotes() { InfoCache = $"{{\"Tag\":\"{_reqInfo.PeriodicReportQuarterDate.Value.Year + quarter}\"}}", IsValid = true, }; } else { switch (_operationType) { case OptFlagsEnum.A: noData = true;//新增数据已报送,跳过 return model; case OptFlagsEnum.U: note.IsValid = true; break; case OptFlagsEnum.D: note.IsValid = false; break; case OptFlagsEnum.NONE: default: throw new ServiceException("未知操作类型"); } } using (var db = new YLContext()) { model.PeriodicReportQuarter.ExceID = base.formatExceID(); model.PeriodicReportQuarter.OperationType = _reqInfo.PeriodicReportQuarterStatus; model.PeriodicReportQuarter.Year = _reqInfo.PeriodicReportQuarterDate.Value.Year.ToString("0000"); model.PeriodicReportQuarter.Quarter = quarter; if (model.PeriodicReportQuarter.OperationType != OptFlagsEnum.A) { model.PeriodicReportQuarter.BizID = note.BizId; } var files = tempFilesService.QueryTempFile(minDate, maxDate, fileType); note.DataId = ""; foreach (var item in files) { if (!ReportStatus.CheckFileLength(item.filePath)) { model.PeriodicReportQuarter.DerivativesQuarterlyReportAnnexTuple?.Clear(); fileList.Clear(); break; } var info = new DerivativesQuarterlyReportAnnexModel { DerivativesQuarterlyReportAnnex = item.fileName }; if (model.PeriodicReportQuarter.DerivativesQuarterlyReportAnnexTuple == null) { model.PeriodicReportQuarter.DerivativesQuarterlyReportAnnexTuple = new List(); } model.PeriodicReportQuarter.DerivativesQuarterlyReportAnnexTuple.Add(info); fileList.Add(item.filePath); note.DataId += item.id + ","; } } noData = !(model.PeriodicReportQuarter.DerivativesQuarterlyReportAnnexTuple?.Count > 0); if (!noData) { ReportStatus.AddCacheInfo(CacheKey, cacheValue); note.id = 0; note.ExceId = model.PeriodicReportQuarter.ExceID; note.CreateTime = DateTime.Now; note.FileTag = FileTag; note.ReportType = ReportType; note.ReportDate = _reqInfo.ReportDate; note.InfoTag = formatInfoTag(_reqInfo.PeriodicReportQuarterDate.Value.Year + quarter, true); note.OptTime = note.CreateTime; note.RetCode = ""; note.RetMsg = ""; note.ReportResponse = false; note.BizId = ""; note.changeStatus = false; noteList.Add(note); } return model; } protected override List CheckBodyValue(BodyModel model, out bool checkStatus) { var result = new List(); if (model?.PeriodicReportQuarter != null) { var listRoot = new List(); var helper = new Common.CheckHelper(); var annexHelper = new Common.CheckHelper(); helper.ExecuteCheck(model.PeriodicReportQuarter, (name, value, msg) => { listRoot.Add(new SacInfo(name, value, msg)); }); if (model.PeriodicReportQuarter.DerivativesQuarterlyReportAnnexTuple != null) { for (var i = 0; i < model.PeriodicReportQuarter.DerivativesQuarterlyReportAnnexTuple.Count; i++) { var listItem = new List(); var item = model.PeriodicReportQuarter.DerivativesQuarterlyReportAnnexTuple[i]; annexHelper.ExecuteCheck(item, (name, value, msg) => { listItem.Add(new SacInfo(name, value, msg)); }); if (listItem.Count > 0) { var temp = new SacInfo("DerivativesQuarterlyReportAnnexTuple", i) { SubMaps = new List(listItem) }; listRoot.Add(temp); } } } if (listRoot.Count > 0) { var errMsg = new SacInfo("PeriodicReportQuarter") { SubMaps = new List(listRoot) }; result.Add(errMsg); } } checkStatus = result.Count > 0; return result; } private string formatInfoTag(string tag, bool suffixType = false) { var result = $"{BusiDataType}_{tag}_"; if (suffixType) { result = $"{result}{_operationType}"; } return result; } protected override string _changeCodeOfInfoTag(string infoTag, string newCode, out string originalCode) { //定期报告中不存在编号,也就不存在修改编号的情况; throw new NotImplementedException(); } public override bool BeforeOfGenerated(out string errMsg) { errMsg = ""; for (var i = 0; i < noteList.Count; i++) { base.SaveReportNotes(noteList[i]); } return true; } } }