You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

794 lines
29 KiB
C#

9 months ago
using JwKdsV.Core;
using JwKdsV.Core.Download;
using JwKdsV.Core.Utils;
using JwKdsV.Entity.Normal;
using JwKdsV.Entity.Product;
using LiteDB;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace JwKdsV
{
public partial class DownloadingForm : BaseForm
{
private System.Timers.Timer timer;
//执行间隔
private const int TIME_INTERVAL = 500;
/// <summary>
/// 是否开始下载
/// </summary>
private bool isDownloading = false;
/// <summary>
/// 是否下载完成
/// </summary>
private bool isFinished = false;
private Dictionary<string, DownloadNotify> downloadError = null;
private Dictionary<string, DownloadNotify> downloadSuccess = null;
public DownloadingForm()
{
InitializeComponent();
this.Text = string.Format("巨为厨显({0})", Application.ProductVersion);
this.timer = new System.Timers.Timer(TIME_INTERVAL);
this.timer.Elapsed += OnTimerElapsed;
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
//内容显示在中央
this.downLoadContainer.Location = new Point((this.Width - this.downLoadContainer.Width) / 2, (this.Height - this.downLoadContainer.Height) / 2);
this.timer.Interval = TIME_INTERVAL;
this.timer.Start();
}
private void OnTimerElapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (!isDownloading)
{
this.downloadError = new Dictionary<string, DownloadNotify>();
this.downloadSuccess = new Dictionary<string, DownloadNotify>();
isDownloading = true;
if (Global.Instance.Worker.WorkerOnlineLogin)
{
//在线登录,下载
StartDownload();
}
else
{
//离线登录,不下载,只组装数据
//StartInstall();
isFinished = true;
}
}
if (isDownloading && isFinished)
{
this.timer.Stop();
this.timer.Enabled = false;
//判断是否发生过错误
if (downloadError != null && downloadError.Keys.Count > 0)
{
this.DialogResult = DialogResult.None;
}
else
{
if (this.InvokeRequired)
{
this.BeginInvoke(new MethodInvoker(() =>
{
this.DialogResult = DialogResult.OK;
this.Close();
}));
}
else
{
this.DialogResult = DialogResult.OK;
this.Close();
}
}
}
}
private void StartDownload()
{
this.downloadError = new Dictionary<string, DownloadNotify>();
this.downloadSuccess = new Dictionary<string, DownloadNotify>();
//清理历史缓存脚本
if (File.Exists(Global.Instance.CacheFullPath))
{
File.Delete(Global.Instance.CacheFullPath);
}
RefreshStatus("清除缓存成功......");
RefreshStatus("开始下载门店数据......");
//清理历史数据
DownloadApi.Instance.InitCache();
//下载操作员数据
var worker = DownloadApi.DownloadWorker();
this.ShowMessage(this.lblStatus, worker.Message);
if (worker.Success)
{
this.AddDownloadSuccess(worker.CacheName, worker);
}
else
{
this.AddDownloadError(worker.CacheName, worker);
}
//下载商品类别信息
var productType = DownloadApi.DownloadProductType(Constant.DEFAULT_PAGESIZE);
this.ShowMessage(this.lblStatus, productType.Message);
//第一页下载成功
if (productType.Success)
{
//判断是否全部下载成功
bool isAllSuccess = true;
//记录最后下载失败的通知消息
DownloadNotify lastFailure = null;
//分页下载
if (productType.IsPager)
{
//当前页码
int pageNum = productType.PageNumber;
//总页数
int pageCount = productType.PageCount;
//每页大小
int pageSize = productType.PageSize;
//逐页下载,任意页下载失败退出下载
for (int page = pageNum + 1; page < pageCount + 1; page++)
{
var notify = DownloadApi.DownloadProductTypeNextPage(page, pageSize);
if (notify.Success)
{
this.ShowMessage(this.lblStatus, notify.Message);
}
else
{
//最后的失败通知
lastFailure = notify;
isAllSuccess = false;
break;
}
System.Threading.Thread.Sleep(10);
}
}
if (isAllSuccess && lastFailure == null)
{
this.AddDownloadSuccess(productType.CacheName, productType);
}
else
{
this.AddDownloadError(lastFailure.CacheName, lastFailure);
}
}
else
{
this.AddDownloadError(productType.CacheName, productType);
}
//下载菜品
var product = DownloadApi.DownloadProduct(Constant.DEFAULT_PAGESIZE);
this.ShowMessage(this.lblStatus, product.Message);
//第一页下载成功
if (product.Success)
{
//判断是否全部下载成功
bool isAllSuccess = true;
//记录最后下载失败的通知消息
DownloadNotify lastFailure = null;
//分页下载
if (product.IsPager)
{
//当前页码
int pageNum = product.PageNumber;
//总页数
int pageCount = product.PageCount;
//每页大小
int pageSize = product.PageSize;
//逐页下载,任意页下载失败退出下载
for (int page = pageNum + 1; page < pageCount + 1; page++)
{
var notify = DownloadApi.DownloadProductNextPage(page, pageSize);
if (notify.Success)
{
this.ShowMessage(this.lblStatus, notify.Message);
}
else
{
//最后的失败通知
lastFailure = notify;
isAllSuccess = false;
break;
}
System.Threading.Thread.Sleep(10);
}
}
if (isAllSuccess && lastFailure == null)
{
this.AddDownloadSuccess(product.CacheName, product);
}
else
{
this.AddDownloadError(lastFailure.CacheName, lastFailure);
}
}
else
{
this.AddDownloadError(product.CacheName, product);
}
//下载商品单位信息
var productUnit = DownloadApi.DownloadProductUnit(Constant.DEFAULT_PAGESIZE);
this.ShowMessage(this.lblStatus, productUnit.Message);
//第一页下载成功
if (productUnit.Success)
{
//判断是否全部下载成功
bool isAllSuccess = true;
//记录最后下载失败的通知消息
DownloadNotify lastFailure = null;
//分页下载
if (productUnit.IsPager)
{
//当前页码
int pageNum = productUnit.PageNumber;
//总页数
int pageCount = productUnit.PageCount;
//每页大小
int pageSize = productUnit.PageSize;
//逐页下载,任意页下载失败退出下载
for (int page = pageNum + 1; page < pageCount + 1; page++)
{
var notify = DownloadApi.DownloadProductUnitNextPage(page, pageSize);
if (notify.Success)
{
this.ShowMessage(this.lblStatus, notify.Message);
}
else
{
//最后的失败通知
lastFailure = notify;
isAllSuccess = false;
break;
}
System.Threading.Thread.Sleep(10);
}
}
if (isAllSuccess && lastFailure == null)
{
this.AddDownloadSuccess(productUnit.CacheName, productUnit);
}
else
{
this.AddDownloadError(lastFailure.CacheName, lastFailure);
}
}
else
{
this.AddDownloadError(productUnit.CacheName, productUnit);
}
//下载商品规格信息
var productSpec = DownloadApi.DownloadProductSpec(Constant.DEFAULT_PAGESIZE);
this.ShowMessage(this.lblStatus, productSpec.Message);
//第一页下载成功
if (productSpec.Success)
{
//判断是否全部下载成功
bool isAllSuccess = true;
//记录最后下载失败的通知消息
DownloadNotify lastFailure = null;
//分页下载
if (productSpec.IsPager)
{
//当前页码
int pageNum = productSpec.PageNumber;
//总页数
int pageCount = productSpec.PageCount;
//每页大小
int pageSize = productSpec.PageSize;
//逐页下载,任意页下载失败退出下载
for (int page = pageNum + 1; page < pageCount + 1; page++)
{
var notify = DownloadApi.DownloadProductSpecNextPage(page, pageSize);
if (notify.Success)
{
this.ShowMessage(this.lblStatus, notify.Message);
}
else
{
//最后的失败通知
lastFailure = notify;
isAllSuccess = false;
break;
}
System.Threading.Thread.Sleep(10);
}
}
if (isAllSuccess && lastFailure == null)
{
this.AddDownloadSuccess(productSpec.CacheName, productSpec);
}
else
{
this.AddDownloadError(lastFailure.CacheName, lastFailure);
}
}
else
{
this.AddDownloadError(productSpec.CacheName, productSpec);
}
////下载商品类别信息
//var productType = DownloadApi.DownloadProductType(Constant.DEFAULT_PAGESIZE);
//this.ShowMessage(this.lblStatus, productType.Message);
////第一页下载成功
//if (productType.Success)
//{
// //判断是否全部下载成功
// bool isAllSuccess = true;
// //记录最后下载失败的通知消息
// DownloadNotify lastFailure = null;
// //分页下载
// if (productType.IsPager)
// {
// //当前页码
// int pageNum = productType.PageNumber;
// //总页数
// int pageCount = productType.PageCount;
// //每页大小
// int pageSize = productType.PageSize;
// //逐页下载,任意页下载失败退出下载
// for (int page = pageNum + 1; page < pageCount + 1; page++)
// {
// var notify = DownloadApi.DownloadProductTypeNextPage(page, pageSize);
// if (notify.Success)
// {
// this.ShowMessage(this.lblStatus, notify.Message);
// }
// else
// {
// //最后的失败通知
// lastFailure = notify;
// isAllSuccess = false;
// break;
// }
// System.Threading.Thread.Sleep(10);
// }
// }
// if (isAllSuccess && lastFailure == null)
// {
// //处理下载数据到SQL缓存中
// if (DownloadApi.CacheProductType(productType))
// {
// this.AddDownloadSuccess(productType.CacheName, productType);
// }
// else
// {
// productType.Success = false;
// productType.Operate = DownloadCacheName.ProductTypeException;
// productType.Message = "处理商品类别信息发生异常......";
// this.AddDownloadError(productType.CacheName, productType);
// }
// }
// else
// {
// this.AddDownloadError(lastFailure.CacheName, lastFailure);
// }
//}
//else
//{
// this.AddDownloadError(productType.CacheName, productType);
//}
////下载菜品
//var product = DownloadApi.DownloadProduct(Constant.DEFAULT_PAGESIZE);
//this.ShowMessage(this.lblStatus, product.Message);
////第一页下载成功
//if (product.Success)
//{
// //判断是否全部下载成功
// bool isAllSuccess = true;
// //记录最后下载失败的通知消息
// DownloadNotify lastFailure = null;
// //分页下载
// if (product.IsPager)
// {
// //当前页码
// int pageNum = product.PageNumber;
// //总页数
// int pageCount = product.PageCount;
// //每页大小
// int pageSize = product.PageSize;
// //逐页下载,任意页下载失败退出下载
// for (int page = pageNum + 1; page < pageCount + 1; page++)
// {
// var notify = DownloadApi.DownloadProductNextPage(page, pageSize);
// if (notify.Success)
// {
// this.ShowMessage(this.lblStatus, notify.Message);
// }
// else
// {
// //最后的失败通知
// lastFailure = notify;
// isAllSuccess = false;
// break;
// }
// System.Threading.Thread.Sleep(10);
// }
// }
// if (isAllSuccess && lastFailure == null)
// {
// //处理下载数据到SQL缓存中
// if (DownloadApi.CacheProduct(product))
// {
// this.AddDownloadSuccess(product.CacheName, product);
// }
// else
// {
// product.Success = false;
// product.Operate = DownloadCacheName.ProductException;
// product.Message = "处理商品信息发生异常......";
// this.AddDownloadError(product.CacheName, product);
// }
// }
// else
// {
// this.AddDownloadError(lastFailure.CacheName, lastFailure);
// }
//}
//else
//{
// this.AddDownloadError(product.CacheName, product);
//}
////下载商品单位信息
//var productUnit = DownloadApi.DownloadProductUnit(Constant.DEFAULT_PAGESIZE);
//this.ShowMessage(this.lblStatus, productUnit.Message);
////第一页下载成功
//if (productUnit.Success)
//{
// //判断是否全部下载成功
// bool isAllSuccess = true;
// //记录最后下载失败的通知消息
// DownloadNotify lastFailure = null;
// //分页下载
// if (productUnit.IsPager)
// {
// //当前页码
// int pageNum = productUnit.PageNumber;
// //总页数
// int pageCount = productUnit.PageCount;
// //每页大小
// int pageSize = productUnit.PageSize;
// //逐页下载,任意页下载失败退出下载
// for (int page = pageNum + 1; page < pageCount + 1; page++)
// {
// var notify = DownloadApi.DownloadProductUnitNextPage(page, pageSize);
// if (notify.Success)
// {
// this.ShowMessage(this.lblStatus, notify.Message);
// }
// else
// {
// //最后的失败通知
// lastFailure = notify;
// isAllSuccess = false;
// break;
// }
// System.Threading.Thread.Sleep(10);
// }
// }
// if (isAllSuccess && lastFailure == null)
// {
// //处理下载数据到SQL缓存中
// if (DownloadApi.CacheProductUnit(productUnit))
// {
// this.AddDownloadSuccess(productUnit.CacheName, productUnit);
// }
// else
// {
// productUnit.Success = false;
// productUnit.Operate = DownloadCacheName.ProductUnitException;
// productUnit.Message = "处理商品单位信息发生异常......";
// this.AddDownloadError(productUnit.CacheName, productUnit);
// }
// }
// else
// {
// this.AddDownloadError(lastFailure.CacheName, lastFailure);
// }
//}
//else
//{
// this.AddDownloadError(productUnit.CacheName, productUnit);
//}
////下载商品单位信息
//var productSpec = DownloadApi.DownloadProductSpec(Constant.DEFAULT_PAGESIZE);
//this.ShowMessage(this.lblStatus, productSpec.Message);
////第一页下载成功
//if (productSpec.Success)
//{
// //判断是否全部下载成功
// bool isAllSuccess = true;
// //记录最后下载失败的通知消息
// DownloadNotify lastFailure = null;
// //分页下载
// if (productSpec.IsPager)
// {
// //当前页码
// int pageNum = productSpec.PageNumber;
// //总页数
// int pageCount = productSpec.PageCount;
// //每页大小
// int pageSize = productSpec.PageSize;
// //逐页下载,任意页下载失败退出下载
// for (int page = pageNum + 1; page < pageCount + 1; page++)
// {
// var notify = DownloadApi.DownloadProductSpecNextPage(page, pageSize);
// if (notify.Success)
// {
// this.ShowMessage(this.lblStatus, notify.Message);
// }
// else
// {
// //最后的失败通知
// lastFailure = notify;
// isAllSuccess = false;
// break;
// }
// System.Threading.Thread.Sleep(10);
// }
// }
// if (isAllSuccess && lastFailure == null)
// {
// //处理下载数据到SQL缓存中
// if (DownloadApi.CacheProductSpec(productSpec))
// {
// this.AddDownloadSuccess(productSpec.CacheName, productSpec);
// }
// else
// {
// productSpec.Success = false;
// productSpec.Operate = DownloadCacheName.ProductSpecException;
// productSpec.Message = "处理商品规格信息发生异常......";
// this.AddDownloadError(productSpec.CacheName, productSpec);
// }
// }
// else
// {
// this.AddDownloadError(lastFailure.CacheName, lastFailure);
// }
//}
//else
//{
// this.AddDownloadError(productSpec.CacheName, productSpec);
//}
EndDownload();
}
/// <summary>
/// 处理下载结束后的工作
/// </summary>
private void EndDownload()
{
try
{
if (downloadError != null && downloadError.Keys.Count > 0)
{
if(MessageBox.Show("数据下载失败,是否放弃更新,直接进入厨房显示系统?", "下载失败提示", MessageBoxButtons.OKCancel) == DialogResult.OK)
{
StartInstall();
isFinished = true;
downloadError = null;
}
else
{
MessageBox.Show("数据下载失败,请重新登录");
}
}
else
{
this.RefreshStatus("数据下载成功,更新中......");
var list = new ConcurrentQueue<string>();
foreach (var entity in DownloadApi.Instance.Cache())
{
list.Enqueue(entity.Sql);
}
lock (Global.Instance.CacheLock)
{
SQLiteUtils.ExecuteTransaction(list);
}
this.ProcessProductType();
//Stopwatch sw = Stopwatch.StartNew();
//var list = new ConcurrentQueue<string>();
//using (var db = new LiteDatabase(Global.Instance.CacheFullPath))
//{
// var table = db.GetCollection<DownloadSqlCache>(DownloadApi.SQL_CACHE_NAME);
// var lists = table.FindAll();
// foreach (var entity in lists)
// {
// list.Enqueue(entity.Sql);
// }
//}
//SQLiteUtils.ExecuteTransaction(list);
StartInstall();
isFinished = true;
}
}
catch (Exception ex)
{
logger.Error(ex, ex.Message);
}
}
private bool ProcessProductType()
{
bool isException = false;
try
{
List<ProductType> productTypes = null;
using (var db = Global.Instance.OpenDataBase)
{
productTypes = db.Query<ProductType>().ToList();
}
//将品类对应的单品数量汇总
if (productTypes != null)
{
var list = new ConcurrentQueue<string>();
var sql = "update pos_product_type set products = {0} where id = '{1}';";
foreach (var entity in productTypes)
{
using (var db = Global.Instance.OpenDataBase)
{
var products = from o in db.Query<Product>()
where o.Type >= 0 && o.Type <= 9 && o.StopFlag == 0 && o.TypePath.Contains(entity.Id)
select o;
list.Enqueue(string.Format(sql, products.Count(), entity.Id));
}
}
if (list.Count > 0)
{
lock (Global.Instance.SyncLock)
{
SQLiteUtils.ExecuteTransaction(list);
}
}
}
}
catch (Exception ex)
{
isException = true;
logger.Error(ex, "加工品类信息异常");
}
return isException;
}
private void StartInstall()
{
//删除历史数据3天前的数据
DeleteHistoryData();
}
private void DeleteHistoryData()
{
this.RefreshStatus("正在清理垃圾数据……");
ConcurrentQueue<string> lists = new ConcurrentQueue<string>();
lists.Enqueue(string.Format("delete from [pos_order] where [saleDate] < '{0}'", DateTime.Now.AddDays(-3).ToString("yyyy-MM-dd HH:mm:ss")));
lists.Enqueue(string.Format("delete from [pos_order_item] where [saleDate] < '{0}'", DateTime.Now.AddDays(-3).ToString("yyyy-MM-dd HH:mm:ss")));
SQLiteUtils.ExecuteTransaction(lists);
}
private void AddDownloadError(string key, DownloadNotify notify)
{
if (this.downloadError.ContainsKey(key))
{
this.downloadError.Remove(key);
}
this.downloadError.Add(key, notify);
}
private void AddDownloadSuccess(string key, DownloadNotify notify)
{
if (this.downloadSuccess.ContainsKey(key))
{
this.downloadSuccess.Remove(key);
}
this.downloadSuccess.Add(key, notify);
}
/// <summary>
/// 显示下载进程描述
/// </summary>
/// <param name="message"></param>
private void RefreshStatus(string message)
{
logger.Info(message);
if (this.lblStatus.InvokeRequired)
{
this.BeginInvoke(new MethodInvoker(() =>
{
this.lblStatus.Text = message;
this.lblStatus.Refresh();
}));
}
else
{
this.lblStatus.Text = message;
this.lblStatus.Refresh();
}
}
}
}