using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; using Aitex.UI.Charting.ViewModel; using System.Threading; using DataAnalysisControl.Core; using Aitex.UI.Charting.Model; using Aitex.DataAnalysis.Core; namespace Aitex.UI.Charting.View { /// /// Interaction logic for DataSourceExportingDialog.xaml /// public partial class DataSourceExportingDialog : Window { public DataSourceExportingDialog(string sourceName, string fileName) { InitializeComponent(); _sourceName = sourceName; _viewModel = CommonViewModel.Instance; if (!_viewModel.DataSources.ContainsKey(_sourceName)) { MessageBox.Show(string.Format(DataAnalysisControl.Properties.Resource.DataSourceExportingDialog_DataSourceExportingDialog_data_source_not_exist, _sourceName)); return; } _source = _viewModel.DataSources[_sourceName]; txt_Info.Content = string.Format(DataAnalysisControl.Properties.Resource.DataSeriesExportingDialog_DataSeriesExportingDialog_exporting, _source.ChamberName, _source.BeginTime.ToString("yyyy/MM/dd HH:mm:ss"), _source.EndTime.ToString("yyyy/MM/dd HH:mm:ss")); txt_Completed.Content = "1%"; progressBar1.Value = 1; _archieveFilePath = fileName; _thread = new Thread(new ThreadStart(Task_Export)); _thread.Name = "数据源导出线程"; _thread.IsBackground = true; _thread.Start(); } CommonViewModel _viewModel; string _sourceName; Model.IDataSource _source; string _archieveFilePath; Thread _thread; private void Task_Export() { try { if (_source is Aitex.UI.Charting.Model.PostgreSqlDataSource) { // Process open file dialog box results ArchivedFile archived = new ArchivedFile(); archived.AliasList = new Dictionary>(); archived.BeginTime = _source.BeginTime; archived.ChamId = _source.ChamberName; archived.WaferDisplayIndex = _source.WaferDisplayIndex; archived.Datas = _source.Datas; archived.Description = _source.Description; archived.EndTime = _source.EndTime; List> recipeInfo = new List>(); foreach (var item in _source.RecipeSteps) recipeInfo.Add(new KeyValuePair(item.StepTime, item.StepName)); archived.RecipeSteps = recipeInfo; foreach (var item in archived.Datas) { item.Value.RawData.Clear(); item.Value.TimeStamp.Clear(); } List timeDataList = new List(); var dataNameList = archived.Datas.Keys.ToList(); DateTime dt = archived.BeginTime; float totalCount = (int)((archived.EndTime - archived.BeginTime).TotalHours * 6 + 0.5); float curCount = 0; do { DateTime nextTime = dt + new TimeSpan(0, 10, 0); if (nextTime > archived.EndTime) nextTime = archived.EndTime; if (nextTime >= dt) { Dictionary qData; var isSucc = _viewModel.GetDbData(archived.ChamId, dt, nextTime, dataNameList, out qData); if (!isSucc) { MessageBox.Show(string.Format(DataAnalysisControl.Properties.Resource.DataSourceExportingDialog_Task_Export_get_data_error, dt.ToString("yyyy/MM/dd HH:mm:ss"), nextTime.ToString("yyyy/MM/dd HH:mm:ss"), archived.ChamId), "Export", MessageBoxButton.OK, MessageBoxImage.Error); return; } else { bool insertTime = false; foreach (var dataName in qData.Keys) { archived.Datas[dataName].RawData.AddRange(qData[dataName].RawData); //archived.Datas[dataName].TimeStamp.AddRange(qData[dataName].TimeStamp); if (!insertTime) { insertTime = true; timeDataList.AddRange(qData[dataName].TimeStamp); } } } qData.Clear(); } dt += new TimeSpan(0, 10, 0); curCount++; txt_Completed.Dispatcher.BeginInvoke(new Action((o) => { if (o > 1) o = 1; txt_Completed.Content = string.Format("{0}%", (o * 100).ToString("F1")); }), curCount / totalCount); progressBar1.Dispatcher.BeginInvoke(new Action((o) => { if (o > 1) o = 1; progressBar1.Value = o * 100; }), curCount / totalCount); } while (dt < archived.EndTime); //use a same time table to reduce data file size if (archived.Datas.Count > 0) { foreach (var item in archived.Datas) { item.Value.TimeStamp = timeDataList; } } // Open document ObjectSerializer.SerializeObjectToBinaryFile(_archieveFilePath, archived); if (archived.Datas != null) archived.Datas.Clear(); GC.Collect(); MessageBox.Show(DataAnalysisControl.Properties.Resource.DataSourceExportingDialog_Task_Export_succeed + _archieveFilePath, "Export", MessageBoxButton.OK, MessageBoxImage.Information); } else if(_source is ArchievedFileDataSource) { var source = _source as ArchievedFileDataSource; ObjectSerializer.SerializeObjectToBinaryFile(_archieveFilePath, source.ArchivedFile); MessageBox.Show(DataAnalysisControl.Properties.Resource.DataSourceExportingDialog_Task_Export_succeed + _archieveFilePath, "Export", MessageBoxButton.OK, MessageBoxImage.Information); } } catch (Exception ex) { CONTEXT.WriteLog(ex, string.Format("导出数据源{0}发生异常", _sourceName)); MessageBox.Show(string.Format(DataAnalysisControl.Properties.Resource.DataSeriesExportingDialog_Task_Export_export_error, ex.Message), "Export", MessageBoxButton.OK, MessageBoxImage.Error); } finally { this.Dispatcher.BeginInvoke(new Action(() => { Close(); })); } } private void btnAbort_Click(object sender, RoutedEventArgs e) { if(_thread != null) _thread.Abort(); Close(); } } }