| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777 | using DocumentFormat.OpenXml.Office2010.Excel;using DocumentFormat.OpenXml.Wordprocessing;using InABox.Logikal;using Ofcas.Lk.Api.Client.Core;using Ofcas.Lk.Api.Client.Ui;using Ofcas.Lk.Api.Core;using Ofcas.Lk.Api.Shared;using PRSLogikal.OpenXML;using System;using System.Collections.Generic;using System.Data;using System.Data.SqlClient;using System.Data.SQLite;using System.Diagnostics;using System.IO;using System.Linq;using System.Linq.Expressions;using System.Threading.Tasks;using System.Windows;using System.Windows.Navigation;namespace PRSLogikal{    public class LogikalLogArguments    {        public String Message { get; private set; }        public LogikalLogArguments(string message)        {            Message = message;        }            }    public delegate void LogikalLogEvent(object sender, LogikalLogArguments args);        public class LogikalServer : IDisposable    {        public event LogikalLogEvent Log;        private void DoLog(String message) => Log?.Invoke(this, new LogikalLogArguments(message));                private IServiceProxyUiResult _proxy;        private ICoreObjectResult<ILoginScopeUi> _login;        public IntPtr WindowHandle { get; private set; }        private static readonly LogikalErrorResponse NOTCONNECTED = new LogikalErrorResponse()        {            Status = LogikalStatus.Disconnected,            Message = $"LogiKal is not connected"        };                private static readonly LogikalErrorResponse NOTLOGGEDIN = new LogikalErrorResponse()        {            Status = LogikalStatus.NotLoggedIn,            Message = $"Not Logged In"        };                public LogikalServer(IntPtr windowHandle)        {            WindowHandle = windowHandle;        }        public LogikalResponse Connect(LogikalConnectRequest request)        {            if (_proxy != null)                return new LogikalConnectResponse();            // Check that LogiKal is actually running from the folder we have specified            var _driveLetter = Path.GetPathRoot(request.Path)?.Split(':').FirstOrDefault()?.ToLower() ?? "c";            var _processes = Process.GetProcessesByName("LogiKal");            var _running = _processes.Any(x => x.MainModule?.FileName.ToLower().Contains($"{_driveLetter}\\common\\bin\\logikal.exe") == true);            if (!_running)            {                return new LogikalErrorResponse()                {                    Status = LogikalStatus.NotRunning,                    Message = $"LogiKal is not running at [{request.Path}]"                };            }            var _p = ServiceProxyUiFactory.CreateServiceProxy(request.Path, "erp");            var _status = _p.ServiceProxyUi.Start();            if (_status.OperationCode != OperationCode.Accepted)            {               return new LogikalErrorResponse()               {                   Status = LogikalStatus.CannotConnect,                   Message = $"Unable to connect to LogiKal at [{request.Path}]: {_status}"               };            }            _proxy = _p;            return new LogikalConnectResponse();        }        public LogikalResponse Disconnect()        {            if (_login != null)                Logout();            if (_proxy != null)            {                _proxy.ServiceProxyUi.Stop();                _proxy.Dispose();            }            _proxy = null;            return new LogikalDisconnectResponse();        }        private void DoOnDisconnecting()        {                    }        public LogikalResponse Login(LogikalLoginRequest request)        {            Dictionary<string, object> _parameters = new Dictionary<string, object>()            {                { WellKnownParameterKey.Login.ProgramMode, "erp" },                { WellKnownParameterKey.Login.ApplicationHandle, WindowHandle },                //{ WellKnownParameterKey.Login.UserName, username },                //{ WellKnownParameterKey.Login.Password, password },                //{ WellKnownParameterKey.Login.EnableEventSynchronization, false },            };            if (_proxy == null)                return NOTCONNECTED;            if (_login != null)                return new LogikalLoginResponse();            var _check = _proxy.ServiceProxyUi.CanLogin(_parameters);            if (!_check.CanExecute)            {                return new LogikalErrorResponse()                {                    Status = LogikalStatus.Restricted,                    Message = $"Login not allowed: {_check}!"                };            }            try            {                var _l = _proxy.ServiceProxyUi.Login(_parameters);                if (_l.OperationCode != OperationCode.Accepted)                {                    _login = null;                    return new LogikalErrorResponse()                    {                        Status = LogikalStatus.Failed,                        Message = $"Login failed: {_l}"                    };                }                else                {                    _login = _l;                    return new LogikalLoginResponse();                }            }            catch (Exception e)            {                return new LogikalErrorResponse()                {                    Status = LogikalStatus.Error,                    Message = $"{e.Message}\n{e.StackTrace}"                };            }                    }        public LogikalResponse Logout()        {            if (_login != null)                _login.Dispose();            _login = null;            return new LogikalLogoutResponse();        }        public bool IsLoggedIn() => _login != null;        private void GetProjectCentres(ICoreObjectResult<IProjectCenterUi> center, List<LogikalProjectCentre> results)        {            var _projectresults = new List<LogikalProject>();            IList<IBaseProjectInfo> _projects = center.CoreObject.ChildrenInfos;            foreach (var _project in _projects)            {                var _summary = new LogikalProject();                PopulateProject(_project, _summary);                _projectresults.Add(_summary);            }            var _result = new LogikalProjectCentre()            {                ID = center.CoreObject.ProjectCenterContainer.Id,                Name = center.CoreObject.Parent != null ? center.CoreObject.Info.DirectoryName : "Project Center",                ParentID = center.CoreObject.Parent != null                    ? center.CoreObject.Parent.ProjectCenterContainer.Id                    : Guid.Empty,                Projects = _projectresults.ToArray()            };            results.Add(_result);            var _children = center.CoreObject.ProjectCenterContainer.GetChildren().CoreObjectResults;            foreach (var _child in _children)                          GetProjectCentres(_child, results);         }        private void PopulateProject(IBaseProjectInfo source, ILogikalProject target)        {            target.ID = source.Guid;            target.Name = source.Name;            target.PersonInCharge = source.PersonInCharge;            target.Path = source.Path;            target.LastUpdated = source.LastChangedDateTime;            target.Created = source.CreatedDateTime;            target.JobNumber = source.AsProjectInfo().JobNumber;            target.OfferNumber = source.AsProjectInfo().OfferNumber;        }        private List<LogikalProjectCentre> GetProjectCentres()        {            var _results = new List<LogikalProjectCentre>();            var _info = _login.CoreObject.ProjectCenterInfos.FirstOrDefault(x => x.Type.Id == 0);            if (_info != null)            {                var _center = _login.CoreObject.GetProjectCenter(_info);                GetProjectCentres(_center, _results);            }            return _results;        }        public LogikalResponse GetProjectCentres(LogikalProjectCentresRequest request)        {            if (_proxy == null)                return NOTCONNECTED;            if (_login == null)                return NOTLOGGEDIN;            var _results = GetProjectCentres();            return new LogikalProjectCentresResponse<LogikalProjectCentre,LogikalProject>() { ProjectCentres = _results.ToArray() };        }        public LogikalResponse GetProjects(LogikalProjectsRequest request)        {            if (_proxy == null)                return NOTCONNECTED;            if (_login == null)                return NOTLOGGEDIN;            List<LogikalProject> _results = new List<LogikalProject>();            var _centres = GetProjectCentres();            foreach (var _centre in _centres)            {                var _projects = _centre.Projects.Where(x => string.Equals(x.JobNumber, request.JobNumber));                _results.AddRange(_projects);            }                       return new LogikalProjectsResponse<LogikalProject>() { Projects = _results.ToArray() };                    }        public LogikalResponse GetProject(LogikalProjectRequest request)        {            if (_proxy == null)                return NOTCONNECTED;            if (_login == null)                return NOTLOGGEDIN;            var _project = _login.CoreObject.GetProjectByGuid(request.ProjectID);            if (_project == null)                return new LogikalErrorResponse()                {                    Status = LogikalStatus.InvalidProjectID,                    Message = $"Cannot Load Project {request.ProjectID}"                };            var response = new LogikalProjectResponse();            PopulateProject(_project.CoreObject.Info, response);            return response;                   }        public LogikalResponse GetPhases(LogikalPhasesRequest request)        {            if (_proxy == null)                return NOTCONNECTED;            if (_login == null)                return NOTLOGGEDIN;            var _project = _login.CoreObject.GetProjectByGuid(request.ProjectID);            if (_project == null)                return new LogikalErrorResponse()                {                    Status = LogikalStatus.InvalidProjectID,                    Message = $"Cannot Load Project {request.ProjectID}"                };            List<LogikalPhase> _results = new List<LogikalPhase>();            var _phases = _project.CoreObject.GetChildren().CoreObjectResults;            foreach (ICoreObjectResult<IPhase> _phase in _phases)            {                var _result = new LogikalPhase()                {                    ID = _phase.CoreObject.Info.Name,                    Name = string.IsNullOrWhiteSpace(_phase.CoreObject.Info.Name) ? "Default Phase" : _phase.CoreObject.Info.Name                };                _results.Add(_result);            }            return new LogikalPhasesResponse<LogikalPhase>() { Phases = _results.ToArray() };        }        public LogikalResponse GetElevations(LogikalElevationsRequest request)        {            if (_proxy == null)                return NOTCONNECTED;            if (_login == null)                return NOTLOGGEDIN;            var _results = new List<LogikalElevation>();            var _project = _login.CoreObject.GetProjectByGuid(request.ProjectID);            if (_project == null)                return new LogikalErrorResponse()                {                    Status = LogikalStatus.InvalidProjectID,                    Message = $"Cannot Load Project {request.ProjectID}"                };            var _phases = _project.CoreObject.GetChildren().CoreObjectResults;            var _phase = _phases.FirstOrDefault(x => x.CoreObject.Info.Name == request.Phase);            if (_phase == null)                return new LogikalErrorResponse()                {                    Status = LogikalStatus.InvalidPhaseID,                    Message = $"Cannot find phase [{request.Phase}] within project [{request.ProjectID}]"                };                        var _elevations = _phase.CoreObject.GetChildren().CoreObjectResults;            foreach (var _elevation in _elevations)            {                var _result = new LogikalElevation();                PopulateElevation(_elevation.CoreObject, _result);                  _results.Add(_result);            }            return new LogikalElevationsResponse<LogikalElevation>() { Elevations = _results.ToArray() };        }        private void PopulateElevation(IElevation source, ILogikalElevation target)        {            target.ID = source.Info.Guid;            target.Name = source.Info.Name;            target.Description = source.Info.SystemDescription;            target.Size = source.Info.Size;            using (var ms = new MemoryStream())            {                IStreamResult thumbnail =                   source.GetThumbnail(new Dictionary<string, object>() { });                thumbnail.Stream.CopyTo(ms);                target.Thumbnail = ms.GetBuffer();            }        }        public LogikalResponse GetBillOfMaterials(LogikalBOMRequest request)        {            if (_proxy == null)                return NOTCONNECTED;            if (_login == null)                return NOTLOGGEDIN;            var _project = _login.CoreObject.GetProjectByGuid(request.ProjectID);            if (_project == null)                return new LogikalErrorResponse()                {                    Status = LogikalStatus.InvalidProjectID,                    Message = $"Cannot Load Project [{request.ProjectID}]"                };            var _elevations = new List<IElevationInfo>();                       if (request.ElevationIDs?.Any() == true)            {                var _phases = _project.CoreObject.GetChildren();                foreach (var _phase in _phases.CoreObjectResults)                    _elevations.AddRange(_phase.CoreObject.ChildrenInfos.Where(x => request.ElevationIDs.Contains(x.Guid)));            }            using (IReportItemsResult reportItemsResult = _project.CoreObject.GetReports())            {                if (reportItemsResult.OperationCode != OperationCode.Accepted)                {                    return new LogikalErrorResponse()                    {                        Status = LogikalStatus.Error,                        Message = $"Cannot Get Reports for Project!"                    };                }                // Filter available reports for the erp export report item                IReportItem reportItem = reportItemsResult.ReportItems.First(rep =>                    (rep.Id == WellKnownReports.Delivery.ErpExport) &&                    (rep.Category.Id == WellKnownReports.Delivery.CategoryId));                // Create parameters for erp export, export format is required, but always sqlite                var exportParameters = new Dictionary<string, object>                {                    { WellKnownParameterKey.Project.Report.ExportFormat, "SQLite" },                };                // Check if report can be exported for the given parameters                var operationInfo = _project.CoreObject.CanGetReport(reportItem, _elevations, exportParameters);                if (!operationInfo.CanExecute)                {                    return new LogikalErrorResponse()                    {                        Status = LogikalStatus.Error,                        Message = $"Cannot Get Erp Report for Project!"                    };                }                // Run report creation asynchronously - begin method starts the operation in background task                using (ISynchronizedOperationResult synchronizedOperationResult =                    _project.CoreObject.BeginGetReport(reportItem, _elevations, exportParameters))                {                    var response = new LogikalBOMResponse<LogikalFinish, LogikalProfile, LogikalComponent, LogikalGlass, LogikalLabour>();                    // End method waits for the background operation to complete in separate task                    using (IStreamResult streamResult = Task.Run<IStreamResult>(() =>                        _project.CoreObject.EndGetReport(synchronizedOperationResult.SynchronizedOperation)).Result)                    {                        PopulateParts(request, response, streamResult);                    }                    return response;                }            }        }        public LogikalResponse GetElevation(LogikalElevationRequest request)        {                        var _project = _login.CoreObject.GetProjectByGuid(request.ProjectID);            if (_project == null)                return new LogikalErrorResponse()                {                    Status = LogikalStatus.InvalidProjectID,                    Message = $"Cannot Load Project [{request.ProjectID}]"                };            var _phases = _project.CoreObject.GetChildren().CoreObjectResults;            var _phase = _phases.FirstOrDefault(p => p.CoreObject.GetChildren().CoreObjectResults.Any(e => e.CoreObject.Info.Guid == request.ElevationID));            if (_phase == null)                return new LogikalErrorResponse()                {                    Status = LogikalStatus.ElevationNotFound,                    Message = $"Cannot find Elevation [{request.ElevationID}] within project [{request.ProjectID}]"                };            var _elevation = _phase.CoreObject.GetChildren().CoreObjectResults.FirstOrDefault(x => x.CoreObject.Info.Guid == request.ElevationID);            if (_elevation == null)            {                return new LogikalErrorResponse()                {                    Status = LogikalStatus.InvalidElevationID,                    Message = $"Cannot find elevation [{request.ElevationID}] within phase [{_phase.CoreObject.Info.Name}]"                };            }            try            {                var response = new LogikalElevationResponse<LogikalFinish, LogikalProfile, LogikalComponent, LogikalGlass, LogikalLabour>();                PopulateElevation(_elevation.CoreObject, response);                // Setup parameters for export of the elevation drawing                var sectionDrawingParameters = new Dictionary<string, object>                {                    { WellKnownParameterKey.Elevation.Drawing.Format, ElevationDrawingFormat.DXF },                    { WellKnownParameterKey.Elevation.Drawing.View, Ofcas.Lk.Api.Shared.View.Interior },                    { WellKnownParameterKey.Elevation.Drawing.Type, ElevationDrawingType.Elevation },                    { WellKnownParameterKey.Elevation.Drawing.DxfVersion, DxfVersion.R12 },                    { WellKnownParameterKey.Elevation.Drawing.ShowDescription, true },                    { WellKnownParameterKey.Elevation.Drawing.ShowDimensions, true },                    { WellKnownParameterKey.Elevation.Drawing.Scale, 1.0 },                };                // Check if the drawing can be exported for the elevation with the given parameters                if (!_elevation.CoreObject.CanGetDrawing(sectionDrawingParameters).CanExecute)                {                    return new LogikalErrorResponse()                    {                        Status = LogikalStatus.Error,                        Message = $"GetDrawing() not permitted for [{request.ElevationID}]"                    };                }                // Generate drawing for the elevation with the given parameters                using (IDrawingResult drawingResult = _elevation.CoreObject.GetDrawing(sectionDrawingParameters))                {                    Stream exportStream = drawingResult.Stream;                    using (var _ms = new MemoryStream())                    {                        exportStream.CopyTo(_ms);                        response.Drawing = _ms.GetBuffer();                    }                }                using (IStreamResult streamResult = _elevation.CoreObject.GetPartsList())                {                    try                    {                        PopulateParts(request, response, streamResult);                        return response;                    }                    catch (Exception e)                    {                        return new LogikalErrorResponse() { Status = LogikalStatus.Error, Message = $"{e.Message}\n{e.StackTrace}" };                    }                }                            }            catch (Exception e)            {                return new LogikalErrorResponse() { Status = LogikalStatus.Error, Message = $"{e.Message}\n\n{e.StackTrace}" };            }        }        private T CheckValue<T>(object value)        {            if (value == null || value is DBNull || value.GetType() != typeof(T))                return default(T);            return (T)value;        }        private void PopulateParts<TRequest, TResponse>(TRequest request, TResponse response, IStreamResult stream)            where TRequest : AbstractLogikalPartsRequest            where TResponse : AbstractLogikalPartsResponse<LogikalFinish, LogikalProfile,LogikalComponent,LogikalGlass,LogikalLabour>        {            var _excelData = new byte[] { };            var _finishes = new List<LogikalFinish>();             var _profiles = new List<LogikalProfile>();            var _components = new List<LogikalComponent>();            var _glass = new List<LogikalGlass>();            var _labour = new List<LogikalLabour>();             var file = Path.ChangeExtension(Path.Combine(Path.GetTempPath(), Path.GetTempFileName()), "sqlite3");            using (var fs = new FileStream(file, FileMode.OpenOrCreate))                stream.Stream.CopyTo(fs);            var sb = new SQLiteConnectionStringBuilder();            sb.DataSource = file;            using (var _connection = new SQLiteConnection(sb.ToString()))            {                _connection.Open();                // Get Finishes                using (var _data = new SQLiteCommand(_connection))                {                    _data.CommandText = request.FinishQuery.Replace('\n', ' ');                    try                    {                        using (var _reader = _data.ExecuteReader())                        {                            DataTable _dt = new DataTable();                            _dt.Load(_reader);                            foreach (DataRow row in _dt.Rows)                            {                                var _finish = new LogikalFinish();                                _finish.Code = CheckValue<string>(row[nameof(LogikalFinish.Code)]);                                _finish.Description = CheckValue<string>(row[nameof(LogikalFinish.Description)]);                                _finishes.Add(_finish);                            }                        }                    }                    catch (Exception e)                    {                        throw new Exception($"Error: {e.Message}\nQuery: {_data.CommandText}\nTrace: {e.StackTrace}");                    }                }                // Get Profiles                using (var _data = new SQLiteCommand(_connection))                {                    _data.CommandText = request.ProfileQuery.Replace('\n', ' ');                    try                    {                        using (var _reader = _data.ExecuteReader())                        {                            DataTable _dt = new DataTable();                            _dt.Load(_reader);                            foreach (DataRow row in _dt.Rows)                            {                                var _profile = new LogikalProfile();                                _profile.Code = CheckValue<string>(row[nameof(LogikalProfile.Code)]);                                _profile.Description = CheckValue<string>(row[nameof(LogikalProfile.Description)]);                                _profile.Quantity = CheckValue<Int64>(row[nameof(LogikalProfile.Quantity)]);                                _profile.Cost = CheckValue<double>(row[nameof(LogikalProfile.Cost)]);                                _profile.Finish = CheckValue<string>(row[nameof(LogikalProfile.Finish)]);                                _profile.Length = CheckValue<double>(row[nameof(LogikalProfile.Length)]);                                _profiles.Add(_profile);                            }                        }                    }                    catch (Exception e)                    {                        throw new Exception($"Error: {e.Message}\nQuery: {_data.CommandText}\nTrace: {e.StackTrace}");                    }                }                // Get Components                using (var _data = new SQLiteCommand(_connection))                {                    _data.CommandText = request.ComponentQuery.Replace('\n', ' ');                    try                    {                        using (var _reader = _data.ExecuteReader())                        {                            DataTable _dt = new DataTable();                            _dt.Load(_reader);                            foreach (DataRow row in _dt.Rows)                            {                                var _component = new LogikalComponent();                                _component.Code = CheckValue<string>(row[nameof(LogikalComponent.Code)]);                                _component.Description = CheckValue<string>(row[nameof(LogikalComponent.Description)]);                                _component.Quantity = CheckValue<double>(row[nameof(LogikalComponent.Quantity)]);                                _component.Cost = CheckValue<double>(row[nameof(LogikalComponent.Cost)]);                                _component.PackSize = CheckValue<double>(row[nameof(LogikalComponent.PackSize)]);                                _components.Add(_component);                            }                        }                    }                    catch (Exception e)                    {                        throw new Exception($"Error: {e.Message}\nQuery: {_data.CommandText}\nTrace: {e.StackTrace}");                    }                                        }                // Get Glass                using (var _data = new SQLiteCommand(_connection))                {                    _data.CommandText = request.GlassQuery.Replace('\n', ' ');                    try                    {                        using (var _reader = _data.ExecuteReader())                        {                            DataTable _dt = new DataTable();                            _dt.Load(_reader);                            foreach (DataRow row in _dt.Rows)                            {                                var _glassitem = new LogikalGlass();                                _glassitem.Code = CheckValue<string>(row[nameof(LogikalGlass.Code)]);                                _glassitem.Description = CheckValue<string>(row[nameof(LogikalGlass.Description)]);                                _glassitem.Quantity = CheckValue<Int64>(row[nameof(LogikalGlass.Quantity)]);                                _glassitem.Cost = CheckValue<double>(row[nameof(LogikalGlass.Cost)]);                                _glassitem.Height = CheckValue<double>(row[nameof(LogikalGlass.Height)]);                                _glassitem.Width = CheckValue<double>(row[nameof(LogikalGlass.Width)]);                                _glassitem.Treatment = CheckValue<string>(row[nameof(LogikalGlass.Treatment)]);                                _glassitem.Location = CheckValue<string>(row[nameof(LogikalGlass.Location)]);                                _glass.Add(_glassitem);                            }                        }                    }                    catch (Exception e)                    {                        throw new Exception($"Error: {e.Message}\nQuery: {_data.CommandText}\nTrace: {e.StackTrace}");                    }                                        }                // Get Labour                using (var _data = new SQLiteCommand(_connection))                {                    _data.CommandText = request.LabourQuery.Replace('\n', ' ');                    try                    {                        using (var _reader = _data.ExecuteReader())                        {                            DataTable _dt = new DataTable();                            _dt.Load(_reader);                            foreach (DataRow row in _dt.Rows)                            {                                var _labouritem = new LogikalLabour();                                _labouritem.Code = CheckValue<string>(row[nameof(LogikalLabour.Code)]);                                _labouritem.Description = CheckValue<string>(row[nameof(LogikalLabour.Description)]);                                _labouritem.Quantity = CheckValue<Int64>(row[nameof(LogikalLabour.Quantity)]);                                _labouritem.Cost = CheckValue<double>(row[nameof(LogikalLabour.Cost)]);                                _labour.Add(_labouritem);                            }                        }                    }                    catch (Exception e)                    {                        throw new Exception($"Error: {e.Message}\nQuery: {_data.CommandText}\nTrace: {e.StackTrace}");                    }                                        }                if (request.IncludeExcelData)                {                    List<string> _tables = new List<string>();                    using (var _master = new SQLiteCommand(_connection))                    {                        _master.CommandText = "select * from sqlite_master where type='table'";                        using (var _reader = _master.ExecuteReader())                        {                            if (_reader.HasRows)                            {                                while (_reader.Read())                                    _tables.Add(_reader.GetString(1));                            }                        }                    }                    DataSet _ds = new DataSet();                    foreach (var _table in _tables)                    {                        using (var _data = new SQLiteCommand(_connection))                        {                            _data.CommandText = $"select * from {_table}";                            using (var _reader = _data.ExecuteReader())                            {                                DataTable _dt = new DataTable(_table);                                _ds.Tables.Add(_dt);                                _dt.Load(_reader);                            }                        }                    }                    var excelApp = OfficeOpenXML.GetInstance();                    using (var _buffer = excelApp.GetExcelStream(_ds, false))                        _excelData = _buffer.GetBuffer();                    _connection.Close();                    File.Delete(file);                }                response.Finishes = _finishes.ToArray();                response.Profiles = _profiles.ToArray();                response.Components = _components.ToArray();                response.Glass = _glass.ToArray();                response.Labour = _labour.ToArray();                response.ExcelData = _excelData;            }        }        public void Dispose()        {            Disconnect();        }    }}
 |