using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.IO; using System.Linq; using System.Net; 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.Navigation; using System.Windows.Shapes; using System.Xml; using Lib = ESSupport.Lib; using System.Timers; using System.Collections; using CL.IO.Zip; namespace RunUpdater { /// /// MainWindow.xaml 的交互逻辑 /// public partial class MainWindow : Window { #region 参数属性 /// /// 更新服务地址 /// string UpdateUri { get; set; } /// /// 更新服务端口 /// string UpdatePort { get; set; } /// /// 更新模式(省份、服务区、收银机) /// string UpdateMode { get; set; } /// /// 模式对应需要上传的值 /// string UpdateValue { get; set; } /// /// 是否正在更新 /// bool UpdateFlag { get; set; } bool UpdateEnd { get; set; } = false; bool WebSiteCheckEnd { get; set; } = false; /// /// 更新信息数据库地址 /// string DataBaseIP { get; set; } /// /// 数据库端口 /// string DataBasePort { get; set; } /// /// 数据库实例名 /// string DataBaseInstance { get; set; } /// /// 数据库名称 /// string DataBaseName { get; set; } /// /// 数据库登录用户名 /// string DataBaseUserName { get; set; } /// /// 数据库登录密码 /// string DataBasePassWord { get; set; } /// /// 本地更新服务站点端口 /// string LocalSitePort { get; set; } /// /// 本地更新服务站点物理路径 /// string SiteDir { get; set; } /// /// 更新文件下载路径 /// string DownPath { get; set; } /// /// 已下载更新文件数 /// int DownCount = 0; /// /// 总更新文件数 /// int FilesCount = 0; /// /// 程序所在路径 /// static string AppDir = AppDomain.CurrentDomain.BaseDirectory; /// /// 程序配置文件路径 /// static string XMLPath = AppDir + "Update.config"; /// /// 站点服务安装/升级包路径 /// static string ServiceFilesDir = AppDir + "ServicePack"; DataTable UpdateListTable; Timer _Timer = new Timer(); BackgroundWorker _UpdateWorker; Lib.OracleHelper _OracleHelper; #endregion private enum Mode { Province, ServerPart, Shop, Machine } private enum Service { ServiceInstall, ServiceUpdate } private Mode IntConvertToEnumOther(int ModeKey) { return (Mode)ModeKey; } public MainWindow() { InitializeComponent(); tbVer.Text = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(); UpdateFlag = false; _UpdateWorker = new BackgroundWorker(); _UpdateWorker.DoWork += BackgroundWorker_DoWork; _UpdateWorker.ProgressChanged += BackgroundWorker_ProgressChanged; _UpdateWorker.RunWorkerCompleted += BackgroundWorker_RunWorkerCompleted; _UpdateWorker.WorkerReportsProgress = true; _UpdateWorker.WorkerSupportsCancellation = true; _Timer.Elapsed += Timer_Tick; _Timer.Interval = 1000; _Timer.Start(); } private void Timer_Tick(object sender, EventArgs e) { if (!_UpdateWorker.IsBusy && !UpdateFlag) { UpdateFlag = true; _UpdateWorker.RunWorkerAsync(); } if (FilesCount != 0) { if (DownCount >= FilesCount && UpdateEnd && WebSiteCheckEnd) { FilesCount = 0; DownCount = 0; for (int i = 5; i > 0; i--) { MessageBeginInvoke("系统版本更新检查完成(" + i + ")", "lblMsg", "Label"); MessageBeginInvoke("100", "downProgress", "ProgressBar"); } Environment.Exit(0); } } } private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) { } private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { } private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e) { MessageBeginInvoke("更新程序正在初始化......", "lblMsg", "Label"); InitializeAttribute(); WebSiteCheck(LocalSitePort); int.TryParse(UpdateMode, out int _Mode); switch (_Mode) { case 0: UpdateValue = Lib.ConfigHelper.GetAppConfig(XMLPath, "UpdateValue"); break; case 1: UpdateValue = ServerPartList(); break; case 2: break; case 3: break; } MessageBeginInvoke("正在获取收银系统版本更新信息......", "lblMsg", "Label"); string _ServiceUri = "http://" + UpdateUri + ":" + UpdatePort + "/Update.asmx"; Hashtable _UpdateMode = new Hashtable() { { "UpdateType", IntConvertToEnumOther(_Mode).ToString() }, { "UpdateValue", UpdateValue } }; try { string _Result = Lib.SoapWSHelper.QuerySoapWebServiceString(_ServiceUri, "POSUpdate", _UpdateMode); DataTable _UpdateTable = Lib.JsonHelper.ToDataTable(_Result); if (_UpdateTable.Rows.Count > 0) { UpdateListTable = _UpdateTable; //"SOFTUPDATE_ID,PROVINCE_CODE,SERVERPART_CODE,SHOPCODE,MACADDRESS,SOFTUPDATE_DATE,SOFTUPDATE_VERSION" DataTable _VersionTable = _UpdateTable.DefaultView.ToTable(true, new string[] { "SOFTUPDATE_VERSION" }); if (_VersionTable.Rows.Count > 0) { Dictionary _UpdateDictionary = new Dictionary(); foreach (DataRow _Row in _VersionTable.Rows) { MessageBeginInvoke("正在获取[" + _Row["SOFTUPDATE_VERSION"].ToString() + "]版本更新文件列表......", "lblMsg", "Label"); try { Hashtable DownLoad = new Hashtable() { { "UpdateType", "DownLoad" }, { "UpdateValue", _Row["SOFTUPDATE_VERSION"].ToString() } }; _Result = Lib.SoapWSHelper.QuerySoapWebServiceString(_ServiceUri, "POSUpdate", DownLoad); XmlDocument _XmlDoc = new XmlDocument(); _XmlDoc.LoadXml(_Result); _UpdateDictionary.Add(_Row["SOFTUPDATE_VERSION"].ToString(), _XmlDoc); } catch { } } for (int i = 0; i < _UpdateDictionary.Count; i++) { FilesCount += _UpdateDictionary[_UpdateDictionary.Keys.ElementAt(i)].SelectNodes("//UpdateFileList//UpdateFile").Count; } CreateFilesDown(_UpdateDictionary); } } else { Environment.Exit(0); } } catch (Exception ex) { EndUpdate("收银系统版本更新失败," + ex.Message); } } /// /// 创建多版本更新文件下载 /// /// 版本列表 private void CreateFilesDown(Dictionary UpdateDictionary) { if (UpdateDictionary.Count > 0) { for (int i = 0; i < UpdateDictionary.Count; i++) { StartDownLoad(UpdateDictionary[UpdateDictionary.Keys.ElementAt(i)], UpdateDictionary.Keys.ElementAt(i)); } } } /// /// 获取服务区列表 /// /// private string ServerPartList() { string _Result = ""; string _Select = "SELECT SERVERPARTCODE FROM " + DataBaseName + ".T_SYSCODE"; try { using (DataTable _Table = _OracleHelper.ExcuteSqlGetDataSet(_Select).Tables[0]) { if (_Table.Rows.Count > 0) { foreach (DataRow _Row in _Table.Rows) { _Result += (_Result == "" ? "" : ",") + _Row["SERVERPARTCODE"].ToString(); } Lib.ConfigHelper.UpdateAppConfig(XMLPath, "UpdateValue", _Result); } else { _Result = Lib.ConfigHelper.GetAppConfig(XMLPath, "UpdateValue"); } } } catch { _Result = Lib.ConfigHelper.GetAppConfig(XMLPath, "UpdateValue"); } return _Result; } /// /// 初始化属性 /// private void InitializeAttribute() { UpdateUri = Lib.ConfigHelper.GetAppConfig(XMLPath, "UpdateIP"); UpdatePort = Lib.ConfigHelper.GetAppConfig(XMLPath, "UpdatePort"); UpdateMode = Lib.ConfigHelper.GetAppConfig(XMLPath, "UpdateMode"); DataBaseIP = Lib.ConfigHelper.GetAppConfig(XMLPath, "DataBaseIP"); DataBasePort = Lib.ConfigHelper.GetAppConfig(XMLPath, "DataBasePort"); DataBaseInstance = Lib.ConfigHelper.GetAppConfig(XMLPath, "DataBaseInstance"); DataBaseName = Lib.ConfigHelper.GetAppConfig(XMLPath, "DataBaseName"); DataBaseUserName = Lib.ConfigHelper.GetAppConfig(XMLPath, "DataBaseUserName"); DataBasePassWord = Lib.ConfigHelper.GetAppConfig(XMLPath, "DataBasePassWord"); LocalSitePort = Lib.ConfigHelper.GetAppConfig(XMLPath, "LocalSitePort"); if (String.IsNullOrWhiteSpace(LocalSitePort)) { LocalSitePort = "11000"; } Hashtable _Hashtable = Lib.IISWorker.GetWebPathAndWebName(LocalSitePort); if (_Hashtable.ContainsKey("path")) { SiteDir = _Hashtable["path"].ToString() + "\\"; } else { SiteDir = AppDir; } //Lib.FileHelper.AddpathPower(SiteDir, "Everyone", Lib.FileHelper.FilePower.FullControl.ToString()); Lib.FileHelper.AddSecurityControll2Folder(SiteDir); DownPath = SiteDir + "UpdateServer"; if (String.IsNullOrWhiteSpace(UpdateUri) || String.IsNullOrWhiteSpace(UpdatePort) || String.IsNullOrWhiteSpace(UpdateMode) || String.IsNullOrWhiteSpace(LocalSitePort)) { InitializeConfigFile(); } //if (UpdateUri != "cloud.eshangtech.com") //{ // UpdateUri = "cloud.eshangtech.com"; // UpdatePort = "11000"; // try // { // Lib.ConfigHelper.UpdateAppConfig(XMLPath, "UpdateIP", UpdateUri); // Lib.ConfigHelper.UpdateAppConfig(XMLPath, "UpdatePort", UpdatePort); // } // catch { } //} _OracleHelper = new Lib.OracleHelper(DataBaseIP, DataBasePort, DataBaseInstance, DataBaseUserName, DataBasePassWord); } /// /// 程序配置文件初始化 /// private void InitializeConfigFile() { try { if (String.IsNullOrWhiteSpace(DataBaseIP)) { DataBaseIP = "localhost"; } Lib.ConfigHelper.UpdateAppConfig(XMLPath, "DataBaseIP", DataBaseIP); if (String.IsNullOrWhiteSpace(DataBasePort)) { DataBasePort = "1521"; } Lib.ConfigHelper.UpdateAppConfig(XMLPath, "DataBasePort", DataBasePort); if (String.IsNullOrWhiteSpace(DataBaseUserName)) { DataBaseUserName = "highway_exchange"; } Lib.ConfigHelper.UpdateAppConfig(XMLPath, "DataBaseUserName", DataBaseUserName); if (String.IsNullOrWhiteSpace(DataBasePassWord)) { DataBasePassWord = "qrwl"; } Lib.ConfigHelper.UpdateAppConfig(XMLPath, "DataBasePassWord", DataBasePassWord); if (String.IsNullOrWhiteSpace(DataBaseInstance)) { DataBaseInstance = "orcl"; } Lib.ConfigHelper.UpdateAppConfig(XMLPath, "DataBaseInstance", DataBaseInstance); if (String.IsNullOrWhiteSpace(DataBaseName)) { DataBaseName = "highway_exchange"; } Lib.ConfigHelper.UpdateAppConfig(XMLPath, "DataBaseName", DataBaseName); if (String.IsNullOrWhiteSpace(LocalSitePort)) { LocalSitePort = "11000"; } Lib.ConfigHelper.UpdateAppConfig(XMLPath, "LocalSitePort", LocalSitePort); if (String.IsNullOrWhiteSpace(UpdatePort)) { string _UpdatePort = Lib.ConfigHelper.GetAppConfig(System.IO.Path.Combine(DownPath, "update.xml"), "Port"); if (String.IsNullOrWhiteSpace(_UpdatePort)) { UpdatePort = "11000"; } else { UpdatePort = _UpdatePort; } } if (String.IsNullOrWhiteSpace(UpdateUri)) { string _UpdateUrl = Lib.ConfigHelper.GetAppConfig(System.IO.Path.Combine(DownPath, "update.xml"), "IP"); if (!Lib.HttpHelper.UrlIsExist("http://" + _UpdateUrl + ":" + UpdatePort + "/Update.asmx")) { UpdateUri = "update.eshangtech.com"; } else { UpdateUri = _UpdateUrl; } } Lib.ConfigHelper.UpdateAppConfig(XMLPath, "UpdateIP", UpdateUri); Lib.ConfigHelper.UpdateAppConfig(XMLPath, "UpdatePort", UpdatePort); if (String.IsNullOrWhiteSpace(UpdateMode)) { if (File.Exists(System.IO.Path.Combine(DownPath, "ProvinceUpdateExe.exe"))) { UpdateMode = "0"; } else { UpdateMode = "1"; } } Lib.ConfigHelper.UpdateAppConfig(XMLPath, "UpdateMode", UpdateMode); if (String.IsNullOrWhiteSpace(UpdateValue)) { string _UpdateValue = Lib.ConfigHelper.GetAppConfig(System.IO.Path.Combine(DownPath, "update.xml"), "Province"); if (String.IsNullOrWhiteSpace(_UpdateValue)) { UpdateValue = "330000"; } else { UpdateValue = _UpdateValue; } } Lib.ConfigHelper.UpdateAppConfig(XMLPath, "UpdateValue", UpdateValue); if (String.IsNullOrWhiteSpace(Lib.ConfigHelper.GetAppConfig(XMLPath, "UpDate"))) { Lib.ConfigHelper.UpdateAppConfig(XMLPath, "UpDate", "2018/03/09 20:33:00"); } if (String.IsNullOrWhiteSpace(Lib.ConfigHelper.GetAppConfig(XMLPath, "SoftVersion"))) { Lib.ConfigHelper.UpdateAppConfig(XMLPath, "SoftVersion", ""); } if (String.IsNullOrWhiteSpace(Lib.ConfigHelper.GetAppConfig(XMLPath, "SoftName"))) { Lib.ConfigHelper.UpdateAppConfig(XMLPath, "SoftName", "驿商统一收银系统"); } if (String.IsNullOrWhiteSpace(Lib.ConfigHelper.GetAppConfig(XMLPath, "KillApp"))) { Lib.ConfigHelper.UpdateAppConfig(XMLPath, "KillApp", ""); } if (String.IsNullOrWhiteSpace(Lib.ConfigHelper.GetAppConfig(XMLPath, "StartApp"))) { Lib.ConfigHelper.UpdateAppConfig(XMLPath, "StartApp", ""); } } catch { } } /// /// 本地自动更新站点检测 /// /// private void WebSiteCheck(string SitePort) { string _LocalWebUri = "http://localhost:" + SitePort + "/Update.asmx"; MessageBeginInvoke("正在检查更新服务站点......", "lblMsg", "Label"); Hashtable _Hashtable = Lib.IISWorker.GetWebPathAndWebName(SitePort); if (_Hashtable.ContainsKey("name")) { SiteDir = _Hashtable["path"].ToString() + "\\"; } else { MessageBeginInvoke("正在创建更新服务站点......", "lblMsg", "Label"); if (!int.TryParse(SitePort, out int SiteID)) { SiteID = Lib.IISWorker.SiteId(); } SiteDir = AppDir; Lib.IISWorker.CreateAppPool7("DefaultAppPool", 1, 1000, "0"); Lib.IISWorker.CreateSite("[" + SitePort + "]自动更新", SiteID, SitePort, "", "Default.aspx,Index.Html,index.asp", AppDir, "DefaultAppPool"); } if (String.IsNullOrWhiteSpace(Lib.ConfigHelper.GetAppConfig(XMLPath, "ServiceVersion"))) { WebSiteInstall(SiteDir); } else { try { HttpWebRequest _HttpWebRequest = (HttpWebRequest)WebRequest.Create(_LocalWebUri); // 有些网站会阻止程序访问,需要加入下面这句 _HttpWebRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"; _HttpWebRequest.Method = "GET"; // Sends the HttpWebRequest and waits for a response. HttpWebResponse _HttpWebResponse = (HttpWebResponse)_HttpWebRequest.GetResponse(); if (_HttpWebResponse.StatusCode == HttpStatusCode.OK) { WebSiteUpdate(SiteDir, Lib.ConfigHelper.GetAppConfig(XMLPath, "ServiceVersion")); } else { if (File.Exists(SiteDir + "Update.asmx")) { WebSiteUpdate(SiteDir, Lib.ConfigHelper.GetAppConfig(XMLPath, "ServiceVersion")); } else { WebSiteInstall(SiteDir); } } _HttpWebResponse.Close(); } catch { WebSiteInstall(SiteDir); } } } /// /// 安装更新服务 /// /// 更新服务安装路径 private void WebSiteInstall(string InstallDir) { string _FileUri = "http://" + UpdateUri + ":" + UpdatePort + "/ServicePack/ServiceInstall.zip"; string _SaveFileName = ServiceFilesDir + "\\ServiceInstall.zip"; string _ServiceUri = "http://" + UpdateUri + ":" + UpdatePort + "/Update.asmx"; if (!Directory.Exists(ServiceFilesDir)) { Directory.CreateDirectory(ServiceFilesDir); } if (File.Exists(_SaveFileName)) { string _InstallFileMd5 = Lib.FileHelper.GetMD5ByMD5CryptoService(_SaveFileName); object[] _object = { Service.ServiceInstall.ToString(), _InstallFileMd5 }; try { string _Result = Lib.WSHelper.InvokeWebService(_ServiceUri, "ServiceUpdate", _object).ToString(); if (!String.IsNullOrWhiteSpace(_Result)) { Dictionary _Dictionary = Lib.JsonHelper.JsonDeserializeBySingleData>(_Result); if (_Dictionary.ContainsKey("Md5")) { if (_Dictionary["Md5"] == _InstallFileMd5) { UnpackService(_SaveFileName, InstallDir, false); WebSiteCheckEnd = true; } else { WebClient _ServiceWebClient = new WebClient(); _ServiceWebClient.DownloadProgressChanged += delegate (object _sender, DownloadProgressChangedEventArgs Event) { //显示下载进度 MessageBeginInvoke("正在下载更新服务安装包......(" + Lib.FileHelper.ConvertSize(Event.BytesReceived) + "/" + Lib.FileHelper.ConvertSize(Event.TotalBytesToReceive) + ")", "lblMsg", "Label"); MessageBeginInvoke(Event.ProgressPercentage.ToString(), "downProgress", "ProgressBar"); }; _ServiceWebClient.DownloadFileCompleted += delegate (object _sender, AsyncCompletedEventArgs Event) { if (Event.Error != null) { MessageBeginInvoke("更新服务安装包下载失败,程序将在下次启动时重试。", "lblMsg", "Label"); } else { MessageBeginInvoke("更新服务安装包下载完成", "lblMsg", "Label"); MessageBeginInvoke("正在校验安装包完整性......", "lblMsg", "Label"); if (Lib.FileHelper.GetMD5ByMD5CryptoService(_SaveFileName) == _Dictionary["Md5"]) { UnpackService(_SaveFileName, InstallDir, false); } else { MessageBeginInvoke("更新服务安装包下载失败,程序将在下次启动时重试。", "lblMsg", "Label"); } } WebSiteCheckEnd = true; }; //创建文件下载线程 _ServiceWebClient.DownloadFileAsync(new Uri(_FileUri), _SaveFileName); } } else { WebSiteCheckEnd = true; } } else { WebSiteCheckEnd = true; } } catch (Exception ex) { WebSiteCheckEnd = true; MessageBeginInvoke("更新服务安装失败,原因:" + ex.Message, "lblMsg", "Label"); } } else { WebClient _ServiceWebClient = new WebClient(); _ServiceWebClient.DownloadProgressChanged += delegate (object _sender, DownloadProgressChangedEventArgs Event) { //显示下载进度 MessageBeginInvoke("正在下载更新服务安装包......(" + Lib.FileHelper.ConvertSize(Event.BytesReceived) + "/" + Lib.FileHelper.ConvertSize(Event.TotalBytesToReceive) + ")", "lblMsg", "Label"); MessageBeginInvoke(Event.ProgressPercentage.ToString(), "downProgress", "ProgressBar"); }; _ServiceWebClient.DownloadFileCompleted += delegate (object _sender, AsyncCompletedEventArgs Event) { if (Event.Error != null) { MessageBeginInvoke("更新服务安装包下载失败,程序将在下次启动时重试。", "lblMsg", "Label"); } else { MessageBeginInvoke("更新服务安装包下载完成", "lblMsg", "Label"); MessageBeginInvoke("正在校验更新文件完整性......", "lblMsg", "Label"); string _InstallFileMd5 = Lib.FileHelper.GetMD5ByMD5CryptoService(_SaveFileName); object[] _object = { Service.ServiceInstall.ToString(), _InstallFileMd5 }; try { string _Result = Lib.WSHelper.InvokeWebService(_ServiceUri, "ServiceUpdate", _object).ToString(); if (!String.IsNullOrWhiteSpace(_Result)) { Dictionary _Dictionary = Lib.JsonHelper.JsonDeserializeBySingleData>(_Result); if (_Dictionary.ContainsKey("Md5")) { if (_Dictionary["Md5"] == _InstallFileMd5) { UnpackService(_SaveFileName, InstallDir, false); } else { MessageBeginInvoke("更新服务安装包下载失败,程序将在下次启动时重试。", "lblMsg", "Label"); } } } } catch { MessageBeginInvoke("更新服务安装包下载失败,程序将在下次启动时重试。", "lblMsg", "Label"); } } WebSiteCheckEnd = true; }; //创建文件下载线程 _ServiceWebClient.DownloadFileAsync(new Uri(_FileUri), _SaveFileName); } } /// /// 更新服务升级检查 /// /// 本地版本号 private void WebSiteUpdate(string UpdateDir, string ServiceVersion) { //服务升级包下载地址 string _FileUri = "http://" + UpdateUri + ":" + UpdatePort + "/ServicePack/ServiceUpdate.zip"; //服务升级包保存地址 string _SaveFileName = ServiceFilesDir + "\\ServiceUpdate.zip"; //服务升级检查WebService接口地址 string _ServiceUri = "http://" + UpdateUri + ":" + UpdatePort + "/Update.asmx"; object[] _object = { Service.ServiceUpdate.ToString(), ServiceVersion }; try { string _Result = Lib.WSHelper.InvokeWebService(_ServiceUri, "ServiceUpdate", _object).ToString(); if (!String.IsNullOrWhiteSpace(_Result)) { Dictionary _Dictionary = Lib.JsonHelper.JsonDeserializeBySingleData>(_Result); if (_Dictionary.ContainsKey("Version")) { if (String.Compare(_Dictionary["Version"], ServiceVersion) > 0) { WebClient _ServiceWebClient = new WebClient(); _ServiceWebClient.DownloadProgressChanged += delegate (object _sender, DownloadProgressChangedEventArgs Event) { //显示下载进度 MessageBeginInvoke("正在下载更新服务升级包......(" + Lib.FileHelper.ConvertSize(Event.BytesReceived) + "/" + Lib.FileHelper.ConvertSize(Event.TotalBytesToReceive) + ")", "lblMsg", "Label"); MessageBeginInvoke(Event.ProgressPercentage.ToString(), "downProgress", "ProgressBar"); }; _ServiceWebClient.DownloadFileCompleted += delegate (object _sender, AsyncCompletedEventArgs Event) { if (Event.Error != null) { MessageBeginInvoke("更新服务升级包下载失败,程序将在下次启动时重试。", "lblMsg", "Label"); } else { MessageBeginInvoke("更新服务升级包下载完成", "lblMsg", "Label"); MessageBeginInvoke("正在校验更新服务升级文件完整性......", "lblMsg", "Label"); if (Lib.FileHelper.GetMD5ByMD5CryptoService(_SaveFileName) == _Dictionary["Md5"]) { UnpackService(_SaveFileName, UpdateDir, true); } else { MessageBeginInvoke("更新服务升级包下载失败,程序将在下次启动时重试。", "lblMsg", "Label"); } } WebSiteCheckEnd = true; }; //创建文件下载线程 _ServiceWebClient.DownloadFileAsync(new Uri(_FileUri), _SaveFileName); } else { WebSiteCheckEnd = true; } } else { WebSiteCheckEnd = true; } } else { WebSiteCheckEnd = true; } } catch { WebSiteCheckEnd = true; MessageBeginInvoke("更新服务升级失败,程序将在下次启动时重试。", "lblMsg", "Label"); } } /// /// 解压安装/升级包 /// /// /// /// private void UnpackService(string ZipPath, string unzipPath, bool IsUpdate) { try { ZipHandler _ZipHandler = ZipHandler.GetInstance(); //获取压缩包密码 MessageBeginInvoke("正在解密自动更新服务" + (IsUpdate ? "升级" : "安装") + "包......", "lblMsg", "Label"); MessageBeginInvoke("100", "downProgress", "ProgressBar"); string _Password = _ZipHandler.GetZipExtensionFileName(ZipPath, ".pw"); if (String.IsNullOrWhiteSpace(_Password)) { _ZipHandler.UnpackAll(ZipPath, unzipPath, (ProgressPercentage) => { MessageBeginInvoke("正在" + (IsUpdate ? "升级" : "安装") + "自动更新服务......" + ProgressPercentage.ToString("F0") + "%", "lblMsg", "Label"); MessageBeginInvoke(ProgressPercentage.ToString(), "downProgress", "ProgressBar"); }); } else { _ZipHandler.UnpackAll(ZipPath, unzipPath, _Password, (ProgressPercentage) => { MessageBeginInvoke("正在" + (IsUpdate ? "升级" : "安装") + "自动更新服务......" + ProgressPercentage.ToString("F0") + "%", "lblMsg", "Label"); MessageBeginInvoke(ProgressPercentage.ToString(), "downProgress", "ProgressBar"); }); } Lib.ConfigHelper.UpdateAppConfig(XMLPath, "ServiceVersion", _Password); } catch { MessageBeginInvoke("更新服务" + (IsUpdate ? "升级" : "安装") + "失败,程序将在下次启动时重试。", "lblMsg", "Label"); } } /// /// 程序更新文件校验 /// /// 文件列表 /// 主程序版本号 /// 程序更新时间 /// 返回更新结果 private bool StartCheckUpdate(Dictionary FileList, string APPVersion) { string[] _Files = Directory.GetFiles(DownPath + "\\" + APPVersion + "\\UpdateFiles"); for (int i = 0; i < FileList.Count; i++) { decimal _Progress = (decimal)(i + 1) / FileList.Count * 100; MessageBeginInvoke("正在校验更新文件完整性......(" + _Progress.ToString("F0") + "%)", "lblMsg", "Label"); MessageBeginInvoke(_Progress.ToString("F2"), "downProgress", "ProgressBar"); string _FileMd5 = Lib.FileHelper.GetMD5ByMD5CryptoService(DownPath + "\\" + APPVersion + "\\UpdateFiles" + FileList.Keys.ElementAt(i)); if (_FileMd5 != FileList[FileList.Keys.ElementAt(i)]) { return false; } } return true; } #region 创建并开始更新文件线程 /// /// 下载更新文件 /// /// 更新文件列表 /// 程序版本 private void StartDownLoad(XmlDocument XMLDoc, string APPVersion) { bool _FinishFlag = true; int _DownCount = 0; Dictionary _FileList = new Dictionary(); XmlNodeList xmlNodeList = XMLDoc.SelectNodes("//UpdateFileList//UpdateFile"); for (int i = 0; i < xmlNodeList.Count; i++) { _FileList.Add(xmlNodeList[i].InnerXml, xmlNodeList[i].Attributes["Md5"].Value); } int _DownEndCount = 0; if (!String.IsNullOrEmpty(APPVersion)) { //创建版本目录 if (!Directory.Exists(DownPath + "\\" + APPVersion + "\\UpdateFiles")) { Directory.CreateDirectory(DownPath + "\\" + APPVersion + "\\UpdateFiles"); } //else //{ // //清空已下载同版本文件 // Lib.FileHelper.DeleteDir(DownPath + "\\" + Version + "\\UpdateFiles"); //} } //创建更新文件下载进程 for (int i = 0; i < _FileList.Count; i++) { decimal _Progress = (decimal)(i + 1) / _FileList.Count * 100; MessageBeginInvoke("正在创建[" + APPVersion + "]更新文件下载任务......(" + _Progress.ToString("F0") + "%)", "lblMsg", "Label"); MessageBeginInvoke(_Progress.ToString("F2"), "downProgress", "ProgressBar"); bool _FileFlag = false; string _FileName = _FileList.Keys.ElementAt(i); //文件Uri路径 string _FileUri = "http://" + UpdateUri + ":" + UpdatePort + "/UpdateServer" + (XMLDoc.SelectNodes("//UpdateInfo//Version") == null ? "" : "/" + APPVersion) + "/UpdateFiles" + _FileName.Replace('\\', '/'); //文件保存位置 string _SaveFileName = DownPath + (APPVersion == null ? "" : "\\" + APPVersion) + "\\UpdateFiles" + _FileName; if (File.Exists(_SaveFileName)) { string _FileMd5 = Lib.FileHelper.GetMD5ByMD5CryptoService(_SaveFileName); if (_FileMd5 == _FileList[_FileName]) { _DownEndCount += 1; DownCount += 1; _FileFlag = true; } } if (!_FileFlag) { WebClient webClient = new WebClient(); webClient.DownloadProgressChanged += delegate (object _sender, DownloadProgressChangedEventArgs Event) { //显示下载进度 MessageBeginInvoke("正在下载更新:" + _FileName.Substring(_FileName.LastIndexOf("\\") + 1, _FileName.LastIndexOf(".rar") - 1).Replace("_", "__") + "(" + Lib.FileHelper.ConvertSize(Event.BytesReceived) + "/" + Lib.FileHelper.ConvertSize(Event.TotalBytesToReceive) + ")", "lblMsg", "Label"); MessageBeginInvoke(Event.ProgressPercentage.ToString(), "downProgress", "ProgressBar"); }; webClient.DownloadFileCompleted += delegate (object _sender, AsyncCompletedEventArgs Event) { if (Event.Error != null) { _FinishFlag = false; } _DownEndCount += 1; DownCount += 1; if (_DownEndCount >= xmlNodeList.Count) { MessageBeginInvoke("更新文件下载完成", "lblMsg", "Label"); MessageBeginInvoke("正在校验更新文件完整性......", "lblMsg", "Label"); if (StartCheckUpdate(_FileList, APPVersion)) { //保存更新列表文件 XMLDoc.Save(DownPath + (APPVersion == null ? "" : "\\" + APPVersion) + "\\UpdateList-" + APPVersion + ".xml"); SaveUpdate(APPVersion); } if (DownCount == FilesCount) { UpdateEnd = true; } } }; //创建文件下载线程 webClient.DownloadFileAsync(new Uri(_FileUri), _SaveFileName); } System.Threading.Thread.Sleep(100); } if (_DownEndCount >= xmlNodeList.Count) { MessageBeginInvoke("更新文件下载完成", "lblMsg", "Label"); MessageBeginInvoke("正在校验更新文件完整性......", "lblMsg", "Label"); if (StartCheckUpdate(_FileList, APPVersion)) { //保存更新列表文件 XMLDoc.Save(DownPath + (APPVersion == null ? "" : "\\" + APPVersion) + "\\UpdateList-" + APPVersion + ".xml"); SaveUpdate(APPVersion); DeleteScratchFile(); } if (DownCount == FilesCount) { UpdateEnd = true; } } } #endregion /// /// 删除无效更新文件 /// private void DeleteScratchFile() { DataTable _VersionTable = UpdateListTable.DefaultView.ToTable(true, new string[] { "SOFTUPDATE_VERSION" }); string[] _strDir = Directory.GetDirectories(DownPath); for (int i = 0; i < _strDir.Count(); i++) { MessageBeginInvoke("正在清除过期更新文件......", "lblMsg", "Label"); MessageBeginInvoke(((decimal)(i + 1) / _strDir.Count() * 100).ToString("F0"), "downProgress", "ProgressBar"); if (Version.TryParse(_strDir[i].Substring(_strDir[i].LastIndexOf('\\') + 1), out Version _Version)) { if (_VersionTable.Select("SOFTUPDATE_VERSION = '" + _strDir[i].Substring(_strDir[i].LastIndexOf('\\') + 1) + "'").Count() == 0) { Lib.FileHelper.DeleteDir(_strDir[i], false); } } } } /// /// 保存版本更新信息 /// /// 版本号 /// private bool SaveUpdate(string APPVersion) { //"SOFTUPDATE_ID,PROVINCE_CODE,SERVERPART_CODE,SHOPCODE,MACADDRESS,SOFTUPDATE_DATE,SOFTUPDATE_VERSION" DataRow[] _DataRow = UpdateListTable.Select(string.Format("SOFTUPDATE_VERSION = '{0}'", APPVersion)); bool _SaveFlag = true; List _SoftUpdateList = new List(); for (int i = 0; i < _DataRow.Count(); i++) { try { MessageBeginInvoke("正在保存[" + APPVersion + "]版本更新信息......", "lblMsg", "Label"); MessageBeginInvoke(((decimal)(i + 1) / _DataRow.Count() * 100).ToString("F0"), "downProgress", "ProgressBar"); string _SelectString = $@"SELECT 1 FROM {DataBaseName}.T_SOFTUPDATE WHERE MACADDRESS = '{_DataRow[i]["MACADDRESS"].ToString()}' AND SERVERPART_CODE = '{_DataRow[i]["SERVERPART_CODE"].ToString()}' AND SHOPCODE = '{_DataRow[i]["SHOPCODE"].ToString()}'"; //string _SelectString = string.Format("SELECT 1 FROM {0}.T_SOFTUPDATE WHERE MACADDRESS = '{1}'", DataBaseName, "00"); if (_OracleHelper.ExcuteSqlGetDataSet(_SelectString).Tables[0].Rows.Count > 0) { string _UpdateString = $@"UPDATE {DataBaseName}.T_SOFTUPDATE SET SOFTUPDATE_VERSION = '{_DataRow[i]["SOFTUPDATE_VERSION"].ToString()}', SOFTUPDATE_DATE = TO_DATE('{_DataRow[i]["SOFTUPDATE_DATE"].ToString()}','YYYY/MM/DD HH24:MI:SS'), SOFTUPDATE_DESC = '{_DataRow[i]["SOFTUPDATE_DESC"].ToString()}' WHERE MACADDRESS = '{_DataRow[i]["MACADDRESS"].ToString()}' AND SERVERPART_CODE = '{_DataRow[i]["SERVERPART_CODE"].ToString()}' AND SHOPCODE = '{_DataRow[i]["SHOPCODE"].ToString()}' "; _OracleHelper.ExecuteSqlTran(_UpdateString); } else { string _InsertString = $@"INSERT INTO {DataBaseName}.T_SOFTUPDATE ( SOFTUPDATE_ID,PROVINCE_CODE,SERVERPART_CODE,SHOPCODE, MACADDRESS,SOFTUPDATE_DATE,SOFTUPDATE_VERSION,SOFTUPDATE_DESC) VALUES ({_DataRow[i]["SOFTUPDATE_ID"].ToString()},'{_DataRow[i]["PROVINCE_CODE"].ToString()}', '{_DataRow[i]["SERVERPART_CODE"].ToString()}','{_DataRow[i]["SHOPCODE"].ToString()}', '{_DataRow[i]["MACADDRESS"].ToString()}',TO_DATE('{_DataRow[i]["SOFTUPDATE_DATE"].ToString()}','YYYY/MM/DD HH24:MI:SS'), '{_DataRow[i]["SOFTUPDATE_VERSION"].ToString()}','{_DataRow[i]["SOFTUPDATE_DESC"].ToString()}')"; _OracleHelper.ExecuteSqlTran(_InsertString); } //服务区更新包下载添加更新上报 if (UpdateMode == "1") { _SoftUpdateList.Add(new SoftUpdateModel { ServerPartCode = _DataRow[i]["SERVERPART_CODE"].ToString(), ShopCode = _DataRow[i]["SHOPCODE"].ToString(), SoftVersion = _DataRow[i]["SOFTUPDATE_VERSION"].ToString(), UpdateDate = DateTime.Parse(DateTime.Now.ToString()) }); } } catch (Exception ex) { Lib.LogHelper.WriteServiceLog("系统更新保存失败:" + ex.Message); _SaveFlag = false; } } try { if (_SoftUpdateList.Count > 0) { var _SoftUpdate = from t in _SoftUpdateList group t by new { t.ServerPartCode, t.ShopCode } into m select new SoftUpdateModel() { ServerPartCode = m.Key.ServerPartCode, ShopCode = m.Key.ShopCode, SoftVersion = m.Max(q => q.SoftVersion), UpdateDate = m.Max(q => q.UpdateDate) }; Hashtable _UpdateList = new Hashtable() { { "jsonData",Newtonsoft.Json.JsonConvert.SerializeObject(_SoftUpdate.ToList()) } }; //上传更新结果至云端 string _ServiceURL = "http://update.eshangtech.com:11000/update.asmx"; Lib.SoapWSHelper.QuerySoapWebServiceString(_ServiceURL, "SoftUpdateFeedback", _UpdateList); } } catch { } return _SaveFlag; } /// /// 更新完成启动程序 /// /// 更新结果消息 private void EndUpdate(string Msg) { MessageBeginInvoke(Msg, "lblMsg", "Label"); //StartSetupAPP(Msg); System.Threading.Thread.Sleep(500); Environment.Exit(0); } #region 控件操作委托 /// /// 控件线程委托 /// /// 消息内容 /// 控件名称 /// 控件类型 delegate void DelegateMessage(string Msg, string ControlName, string ControlType); /// /// 线程委托操作事件 /// /// 消息内容 /// 控件名称 /// 控件类型 private void MessageBeginInvoke(string Msg, string ControlName, string ControlType) { Dispatcher.BeginInvoke(new DelegateMessage(MessageHandle), new object[] { Msg, ControlName, ControlType }); } /// /// 线程消息操作 /// /// 消息内容 /// 控件名称 /// 控件类型 private void MessageHandle(string Msg, string ControlName, string ControlsType) { switch (ControlsType) { case "ProgressBar": if (double.TryParse(Msg, out double _Value)) { ProgressBar _ProgressBar = (ProgressBar)FindName(ControlName); _ProgressBar.Value = _Value; } break; case "Label": Label _Label = (Label)FindName(ControlName); _Label.Content = Msg; break; case "Image": Image _Image = (Image)FindName(ControlName); _Image.Source = new BitmapImage(new Uri(Msg, UriKind.Relative)); break; } } #endregion } }