Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Data.Objects;
- using System.IO;
- using System.Linq;
- using GUTFIRK.ForestManagement.Domain;
- using GUTFIRK.ForestManagement.Domain.ModelEntities;
- using GUTFIRK.ForestManagement.Domain.ReportServiceInterface;
- using GUTFIRK.ForestManagement.Domain.ReportServiceInterface.ReportsDescriptions.ForestFund;
- using GUTFIRK.ForestManagement.Domain.ReportServiceInterface.ReportsParams;
- using GUTFIRK.Utils;
- using GUTFIRK.Utils.TemplateSystem;
- namespace GUTFIRK.ForestManagement.ReportService.ReportsCreators
- {
- /// <summary>
- /// Класс, созающий отчет "Сортиментная структура насаждений"
- /// </summary>
- public sealed class SortimentStruct_ReportCreator : SelectOptionsAdapter
- {
- #region Private members
- const short HEIGHTRANK_KEY = 1;
- object _lockObject = new object();
- #endregion
- public SortimentStruct_ReportCreator()
- {
- _description = new SortimentStruct_ReportDescription();
- }
- /// <summary>
- /// Вспомогательный класс для передачи результатов расчетов
- /// </summary>
- public class SortimentStruct_ReportData
- {
- //Список значений
- public Dictionary<short, SortimentCalculatorItem> Dictionary { get; set; }
- //Список пород
- public List<Stock> StockList { get; set; }
- //Площадь
- public double Area { get; set; }
- //Год актуализации
- public short Year { get; set; }
- //Название отчета
- public string ReportName { get; set; }
- }
- public override void CreateDocument(object obj, string formatKey, Procedure<int> progressCallback, string templateFolder, System.IO.Stream outputStream)
- {
- #region Создание документа
- SortimentStruct_ReportData rd = (SortimentStruct_ReportData)obj;
- TemplateProcessor tprocessor = new TemplateProcessor();
- //templateFolder += _description.Key + "\\" + formatKey + "\\";
- DateTime creationDateTime = DateTime.Now;
- string emptyValue = formatKey == Program.HTML_FORMAT_KEY ? " " : String.Empty;
- tprocessor.Parameters.Add(new TemplateParameter("R_PROPERTY", tprocessor.ReadFile(templateFolder + "rproperty.tpl")));
- tprocessor.Parameters.Add(new TemplateParameter("R_PROPERTY_2", tprocessor.ReadFile(templateFolder + "rproperty2.tpl")));
- tprocessor.Parameters.Add(new TemplateParameter("R_PROPERTY_H", tprocessor.ReadFile(templateFolder + "rproperty_h.tpl")));
- tprocessor.Parameters.Add(new TemplateParameter("PAGE_BREAK", tprocessor.ProcessFile(templateFolder + "pagebreak.tpl")));
- tprocessor.Parameters.Add(new TemplateParameter("DOCUMENT_CREATION_DATETIME", String.Format("{0}-{1:D2}-{2:D2}T{3:D2}:{4:D2}:{5:D2}Z", creationDateTime.Year, creationDateTime.Month, creationDateTime.Day, creationDateTime.Hour, creationDateTime.Minute, creationDateTime.Second)));
- // Год учета лесного фонда - на единицу меньше года актуализации данных.
- tprocessor.Parameters.Add(new TemplateParameter("YEAR", String.Format("{0}", rd.Year - 1)));
- tprocessor.Parameters.Add(new TemplateParameter("DOCUMENT_CREATION_DATE", creationDateTime.ToShortDateString()));
- tprocessor.Parameters.Add(new TemplateParameter("ROWS_CONTENT"));
- tprocessor.Parameters.Add(new TemplateParameter("BODY_CONTENT"));
- tprocessor.Parameters.Add(new NumberTemplateParameter("AREA", emptyValue, rd.Area));
- for (int i = 1; i <= 14; i++)
- {
- tprocessor.Parameters.Add(new NumberTemplateParameter(String.Format("P{0}", i), emptyValue));
- tprocessor.Parameters.Add(new NumberTemplateParameter(String.Format("P{0}_P", i), emptyValue));
- }
- tprocessor.Parameters.Add(new HtmlEncodedTemplateParameter("REPORT_NAME", emptyValue, rd.ReportName));
- tprocessor.Parameters.Add(new HtmlEncodedTemplateParameter("STOCK_NAME", emptyValue, rd.ReportName));
- short[] keys = new short[rd.Dictionary.Keys.Count];
- rd.Dictionary.Keys.CopyTo(keys, 0);
- double q = 0.0;
- // Суммирующий массив под итоговую строку
- double[] sum = new double[15];
- // ПЕЧАТЬ ПЕРВОГО ЛИСТА
- foreach (short key in keys)
- {
- Stock stock = rd.StockList.First(a => a.OID == key);
- tprocessor.Parameters["STOCK_NAME"].Value = stock.Name;
- tprocessor.Parameters["P1"].Value = rd.Dictionary[key].PIL_12;
- tprocessor.Parameters["P2"].Value = rd.Dictionary[key].PIL_34;
- tprocessor.Parameters["P3"].Value = rd.Dictionary[key].PIL;
- tprocessor.Parameters["P4"].Value = rd.Dictionary[key].BAL_12;
- tprocessor.Parameters["P5"].Value = rd.Dictionary[key].BAL_34;
- tprocessor.Parameters["P6"].Value = rd.Dictionary[key].BAL;
- tprocessor.Parameters["P7"].Value = rd.Dictionary[key].DELOV;
- tprocessor.Parameters["P8"].Value = rd.Dictionary[key].TEX;
- tprocessor.Parameters["P9"].Value = rd.Dictionary[key].DROV;
- tprocessor.Parameters["P10"].Value = rd.Dictionary[key].OTX;
- tprocessor.Parameters["P11"].Value = rd.Dictionary[key].VSEGO;
- tprocessor.Parameters["P12"].Value = rd.Dictionary[key].SORT_PIL;
- tprocessor.Parameters["P13"].Value = rd.Dictionary[key].SORT_BAL;
- tprocessor.Parameters["P14"].Value = rd.Dictionary[key].SORT_FAN;
- sum[1] += rd.Dictionary[key].PIL_12;
- sum[2] += rd.Dictionary[key].PIL_34;
- sum[3] += rd.Dictionary[key].PIL;
- sum[4] += rd.Dictionary[key].BAL_12;
- sum[5] += rd.Dictionary[key].BAL_34;
- sum[6] += rd.Dictionary[key].BAL;
- sum[7] += rd.Dictionary[key].DELOV;
- sum[8] += rd.Dictionary[key].TEX;
- sum[9] += rd.Dictionary[key].DROV;
- sum[10] += rd.Dictionary[key].OTX;
- sum[11] += rd.Dictionary[key].VSEGO;
- sum[12] += rd.Dictionary[key].SORT_PIL;
- sum[13] += rd.Dictionary[key].SORT_BAL;
- sum[14] += rd.Dictionary[key].SORT_FAN;
- if (rd.Dictionary[key].VSEGO == 0.0)
- q = 0;
- else
- q = 100.0 / rd.Dictionary[key].VSEGO;
- tprocessor.Parameters["P1_P"].Value = (q * rd.Dictionary[key].PIL_12);
- tprocessor.Parameters["P2_P"].Value = (q * rd.Dictionary[key].PIL_34);
- tprocessor.Parameters["P3_P"].Value = (q * rd.Dictionary[key].PIL);
- tprocessor.Parameters["P4_P"].Value = (q * rd.Dictionary[key].BAL_12);
- tprocessor.Parameters["P5_P"].Value = (q * rd.Dictionary[key].BAL_34);
- tprocessor.Parameters["P6_P"].Value = (q * rd.Dictionary[key].BAL);
- tprocessor.Parameters["P7_P"].Value = (q * rd.Dictionary[key].DELOV);
- tprocessor.Parameters["P8_P"].Value = (q * rd.Dictionary[key].TEX);
- tprocessor.Parameters["P9_P"].Value = (q * rd.Dictionary[key].DROV);
- tprocessor.Parameters["P10_P"].Value = (q * rd.Dictionary[key].OTX);
- tprocessor.Parameters["P12_P"].Value = (q * rd.Dictionary[key].SORT_PIL);
- tprocessor.Parameters["P13_P"].Value = (q * rd.Dictionary[key].SORT_BAL);
- tprocessor.Parameters["P14_P"].Value = (q * rd.Dictionary[key].SORT_FAN);
- tprocessor.Parameters["ROWS_CONTENT"].Value += tprocessor.ProcessFile(templateFolder + "row1.tpl");
- }
- // Итоговая строка
- for (int i = 1; i <= 14; i++)
- {
- string param_name = String.Format("P{0}", i);
- tprocessor.Parameters[param_name].Value = sum[i];
- sum[i] = 0.0;
- }
- tprocessor.Parameters["ROWS_CONTENT"].Value += tprocessor.ProcessFile(templateFolder + "row2.tpl");
- tprocessor.Parameters["BODY_CONTENT"].Value += tprocessor.ProcessFile(templateFolder + "header1.tpl");
- // ПЕЧАТЬ ВТОРОГО ЛИСТА
- tprocessor.Parameters["ROWS_CONTENT"].Value = String.Empty;
- foreach (short key in keys)
- {
- Stock stock = rd.StockList.First(a => a.OID == key);
- tprocessor.Parameters["STOCK_NAME"].Value = stock.Name;
- tprocessor.Parameters["P1"].Value = rd.Dictionary[key].TEX_DR;
- tprocessor.Parameters["P2"].Value = rd.Dictionary[key].DROV_DR;
- tprocessor.Parameters["P3"].Value = rd.Dictionary[key].OTX_DR;
- tprocessor.Parameters["P4"].Value = rd.Dictionary[key].VSEGO_DR;
- sum[1] += rd.Dictionary[key].TEX_DR;
- sum[2] += rd.Dictionary[key].DROV_DR;
- sum[3] += rd.Dictionary[key].OTX_DR;
- sum[4] += rd.Dictionary[key].VSEGO_DR;
- if (rd.Dictionary[key].VSEGO_DR == 0.0)
- q = 0;
- else
- q = 100.0 / rd.Dictionary[key].VSEGO_DR;
- tprocessor.Parameters["P1_P"].Value = (q * rd.Dictionary[key].TEX_DR);
- tprocessor.Parameters["P2_P"].Value = (q * rd.Dictionary[key].DROV_DR);
- tprocessor.Parameters["P3_P"].Value = (q * rd.Dictionary[key].OTX_DR);
- tprocessor.Parameters["ROWS_CONTENT"].Value += tprocessor.ProcessFile(templateFolder + "row3.tpl");
- }
- // Итоговая строка
- tprocessor.Parameters["P1"].Value = sum[1];
- tprocessor.Parameters["P2"].Value = sum[2];
- tprocessor.Parameters["P3"].Value = sum[3];
- tprocessor.Parameters["P4"].Value = sum[4];
- tprocessor.Parameters["ROWS_CONTENT"].Value += tprocessor.ProcessFile(templateFolder + "row4.tpl");
- tprocessor.Parameters["BODY_CONTENT"].Value += tprocessor.ProcessFile(templateFolder + "header2.tpl");
- tprocessor.ProcessFileToStream(outputStream, templateFolder + "document.tpl");
- #endregion
- }
- public override object DoCalculations(IReportParams _reportParams, Procedure<int> progressCallback)
- {
- CheckParams(_reportParams);
- #region Переменные
- var reportParams = (ForestResourcesReportParams)_reportParams;// as ForestResourcesReportParams;
- var year = (short)reportParams.SelectOptions.YearOfActualization;
- SortimentStruct_ReportData reportData = new SortimentStruct_ReportData();
- List<NormativeAssociation> _normativeAssociationList = null;
- Dictionary<short, SortimentCalculatorItem> _dictionary = new Dictionary<short, SortimentCalculatorItem>();
- List<Stock> _stockList = new List<Stock>();
- double _area = 0.0;
- // Переменные для вызова callback-метода, отвечающего за вывод прогресса.
- var qIDs = GetQuarterIDs(reportParams.SelectOptions);
- var fullQuarterIds = GetFullQuarterIDs(reportParams.SelectOptions);
- double _progress_q = 90.0 / qIDs.Count; // множитель
- int _progress_counter = 0; // счетчик
- #endregion
- using (ModelContext context = new ModelContext())
- {
- _normativeAssociationList = context.NormativeAssociationSet.Where("it.Year = @year", new ObjectParameter("year", year)).Include("NormativeData").Include("Forestry").ToList<NormativeAssociation>();
- foreach (var quarterID in qIDs)
- {
- #region Callback
- _progress_counter++;
- progressCallback(Convert.ToInt32(_progress_counter * _progress_q));
- #endregion
- var quarter = context.QuarterSet.Include("DivisionalForestry.Forestry").FirstOrDefault(x => x.OID == quarterID);
- if (quarter == null)
- continue;
- List<int> sortedIdentifiers = null;
- if (fullQuarterIds.BinarySearch(quarterID) >= 0)
- {
- quarter.Stratums.Load();
- sortedIdentifiers = quarter.Stratums.Select(x => x.OID).ToList();
- }
- else
- {
- sortedIdentifiers = GetStratumIDsFromPartialQuarter(reportParams.SelectOptions, quarterID);
- }
- sortedIdentifiers.Sort();
- NormativeAssociation na = _normativeAssociationList.Where<NormativeAssociation>(a => a.Forestry.OID == quarter.GetForestry().OID).First();
- // Ошибка может возникнуть в случае, если лесничеству не сопоставлен набор НСИ в указанный год.
- if (na == null)
- throw new ReportException(reportParams, String.Format("Отсутствует набор НСИ для квартала (OID = {0})", quarter.OID));
- #region Выполнение хранимых процедур и обработка ошибок
- List<vw_QuarterAgeDataItem> vw_AgeDataResult = null; //Список возрастных характеристик
- List<vw_QuarterSortimentItem> vw_SortimentResult = null; //Список распределений сортиментов
- // Блокировка вызова хранимых процедур
- lock (_lockObject)
- {
- int counter = 0;
- bool success = false;
- //Попытка выполнить хранимые процедуры
- while (!success)
- {
- try
- {
- counter++; // Увеличиваем значение счетчика
- // Получаем возрастные характеристики на квартал.
- vw_AgeDataResult = context.GetMainStockAgeDataOnQuarter(quarter.OID, na.NormativeData.OID, na.CuttingAgeKey, year).ToList();
- // Получаем распределение сортиментов на квартал
- vw_SortimentResult = context.GetSortimentItemOnQuarter(quarter.OID, na.Year, na.CommodityTableKey, HEIGHTRANK_KEY).ToList();
- success = true; // Выполнение хранимой процедуры успешно
- }
- // В случае ошибки выполнения хранимой процедуры 10 раз подряд останавливаем формирование отчета
- catch
- {
- if (counter >= 10) break;
- }
- }
- if (!success) throw new ReportException(reportParams, "Ошибка доступа к хранимой процедуре");
- }
- #endregion
- // Список таксационных характеристик
- List<TaxData> taxDataList = quarter.GetTaxDataList(context, year);
- // Общие характеристики на квартал
- List<CommonData> commonDataList = quarter.GetCommonDataList(context, na.Year);
- foreach (vw_QuarterAgeDataItem ageDataItem in vw_AgeDataResult)
- {
- // 0 в ReturnCode - все поля заполнены
- // Рассматриваем только покрытые лесом земли, возможные для эксплуатации (с возрастом главной породы, превышающим возраст рубки) относящиеся к спелым и перестойным лесам
- // TODO: Добавить поддержку приспевающих
- //if (ageDataItem.ReturnCode.HasValue && ageDataItem.ReturnCode.Value == 0 && ageDataItem.IsExploitable.Value == true && ageDataItem.Age.Value >= ageDataItem.CuttingAge.Value)
- if (context.BinarySearch(sortedIdentifiers, Convert.ToInt32(ageDataItem.Stratum_OID)))
- {
- if (ageDataItem.ReturnCode.HasValue && ageDataItem.ReturnCode.Value == 0 && ageDataItem.IsExploitable.Value == true && ageDataItem.AgeGroup_OID.Value >= 4)
- {
- CommonData commonData = commonDataList.First(a => a.OID == ageDataItem.CommonData_OID);
- //List<CommonData> _commonDataList = commonDataList.Where(a=>a.GetStratum().OID == ageDataItem.Stratum_OID).ToList();
- //foreach (CommonData commonData in _commonDataList)
- //{
- _area += commonData.Area;
- List<TaxData> tax_list = new List<TaxData>();
- tax_list = taxDataList.Where(a => a.GetCommonData().OID == commonData.OID).ToList();
- foreach (TaxData taxData in tax_list)
- {
- if (taxData.Volume == 0.0 || taxData.Stock == null)
- {
- // context.Detach(taxData);
- continue;
- }
- // элемент сортиментной таблицы
- vw_QuarterSortimentItem sortimentItem = vw_SortimentResult.First(a => a.TaxData_OID == taxData.OID);
- if (sortimentItem == null || sortimentItem.ReturnCode.Value != 0)
- {
- // context.Detach(taxData);
- continue;
- }
- short stock_oid = sortimentItem.SortimentStock_OID.Value;
- if (_dictionary.ContainsKey(stock_oid) == false)
- {
- _dictionary.Add(stock_oid, new SortimentCalculatorItem());
- object stockObj = context.GetObjectByKey(EdmUtils.CreateEntityKey(context, "Stock", stock_oid));
- _stockList.Add((Stock)stockObj);
- }
- _dictionary[stock_oid].PIL_12 += sortimentItem.PIL_12;
- _dictionary[stock_oid].PIL_34 += sortimentItem.PIL_34;
- _dictionary[stock_oid].BAL_12 += sortimentItem.BAL_12;
- _dictionary[stock_oid].BAL_34 += sortimentItem.BAL_34;
- _dictionary[stock_oid].TEX += sortimentItem.TEX;
- _dictionary[stock_oid].DROV += sortimentItem.DROV;
- _dictionary[stock_oid].OTX += sortimentItem.OTX;
- _dictionary[stock_oid].SORT_BAL += sortimentItem.SORT_BAL;
- _dictionary[stock_oid].SORT_FAN += sortimentItem.SORT_FAN;
- _dictionary[stock_oid].SORT_PIL += sortimentItem.SORT_PIL;
- _dictionary[stock_oid].TEX_DR += sortimentItem.TEX_DR;
- _dictionary[stock_oid].DROV_DR += sortimentItem.DROV_DR;
- _dictionary[stock_oid].OTX_DR += sortimentItem.OTX_DR;
- //context.Detach(taxData);
- }
- //}
- }
- }
- }
- #region Detaching
- foreach (TaxData taxData in taxDataList)
- context.Detach(taxData);
- foreach (CommonData commonData in commonDataList)
- context.Detach(commonData);
- foreach (vw_QuarterAgeDataItem ageDataItem in vw_AgeDataResult)
- context.Detach(ageDataItem);
- foreach (vw_QuarterSortimentItem sortimentItem in vw_SortimentResult)
- context.Detach(sortimentItem);
- context.Detach(quarter);
- #endregion
- }
- }
- #region Проверка заполнения и передача значений внутреннего класса
- if (_dictionary.Keys.Count == 0)
- throw new ReportException(reportParams, "Отсутствует содержание отчета.");
- if (_area == 0.0)
- throw new ReportException(reportParams, "Площадь равна нулю.");
- reportData.ReportName = reportParams.Name;
- reportData.Year = year;
- reportData.Dictionary = _dictionary;
- reportData.StockList = _stockList;
- reportData.Area = _area;
- #endregion
- return reportData;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement