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 { if (_validOperationType == null) { _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; List noteList = new List(); 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(); string[] 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; BodyModel model = new BodyModel(); var cacheKey = $"{BusiDataType}"; var cacheValue = formatInfoTag(_reqInfo.PeriodicReportQuarterDate.Value.Year + quarter); if (ReportStatus.CheckCacheInfo(cacheKey, cacheValue)) { return model; } model.PeriodicReportQuarter = new PeriodicReportQuarterModel(); SACReportNotes 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(); info.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) { List result = new List(); if (model?.PeriodicReportQuarter != null) { List listRoot = new List(); CheckHelper helper = new Common.CheckHelper(); CheckHelper annexHelper = new Common.CheckHelper(); helper.ExecuteCheck(model.PeriodicReportQuarter, (name, value, msg) => { listRoot.Add(new SacInfo(name, value, msg)); }); if (model.PeriodicReportQuarter.DerivativesQuarterlyReportAnnexTuple != null) { for (int 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); temp.SubMaps = new List(listItem); listRoot.Add(temp); } } } if (listRoot.Count > 0) { var errMsg = new SacInfo("PeriodicReportQuarter"); errMsg.SubMaps = new List(listRoot); result.Add(errMsg); } } checkStatus = result.Count > 0; return result; } private string formatInfoTag(string tag, bool suffixType = false) { string result = $"{BusiDataType}_{tag}_"; if (suffixType) { result = $"{result}{_operationType}"; } return result; } public override bool BeforeOfGenerated(out string errMsg) { errMsg = ""; for (int i = 0; i < noteList.Count; i++) { base.SaveReportNotes(noteList[i]); } return true; } } }