年度变更建库软件5.0版本
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

797 lines
27 KiB

using KGIS.Framework.Utils;
using KGIS.Framework.Utils.Helper;
using Kingo.PluginServiceInterface.Model;
using KUI.Windows;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Input;
namespace Kingo.PluginServiceInterface.WizardFramework
{
/// <summary>
/// WizardWindow.xaml 的交互逻辑
/// </summary>
public partial class WizardWindow : BaseWindow
{
#region 字段
/// <summary>
/// 状态标志位
/// </summary>
public enum WizardState
{
/// <summary>
/// 未初始化
/// </summary>
Uninitialized,
/// <summary>
/// 启动状态
/// </summary>
Start,
/// <summary>
/// 中间状态
/// </summary>
Middle,
/// <summary>
/// 结束状态
/// </summary>
End,
}
/// <summary>
/// 向导模式
/// </summary>
public enum WizardModel
{
/// <summary>
/// 分步执行模式
/// </summary>
SimpleModel,
/// <summary>
/// 分步设置一键执行模式
/// </summary>
StepSettingModel,
/// <summary>
/// 一键执行模式
/// </summary>
OneKeyModel,
}
/// <summary>
/// 记录当前步骤
/// </summary>
private int m_currentSetp;
/// <summary>
/// 记录向导状态
/// </summary>
private WizardState m_state;
/// <summary>
/// 记录向导模式
/// </summary>
private WizardModel m_model;
private ListCollectionView m_view;
List<IWizardFramework> m_WizardSteps = new List<IWizardFramework>();
#endregion
#region 属性
/// <summary>
/// 向导状态
/// </summary>
public WizardState State
{
get { return m_state; }
}
/// <summary>
/// 向导模式
/// </summary>
public WizardModel Model
{
get { return m_model; }
set { m_model = value; }
}
#region
private string m_prefilishBtnName = "完成";
private bool m_isSucessFinsh = false;//在新一轮里是否成功的执行完成
private string m_finishBtnName = "完成";
/// <summary>
/// 根据需要改变完成按钮,执行完了名字变回“完成”
/// </summary>
public string FinishBtnName
{
get { return m_finishBtnName; }
set
{
m_prefilishBtnName = m_finishBtnName;
m_finishBtnName = value;
this.btnFinish.Content = m_finishBtnName;
}
}
#endregion
#endregion
/// <summary>
/// 构造函数
/// </summary>
public WizardWindow()
{
InitializeComponent();
m_currentSetp = -1;
m_state = WizardState.Uninitialized;
PluginArea.Children.Clear();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
//ThemeManager.SetThemeName(this, "Office2013LightGray");
++m_currentSetp;
SetWizardMode();
SetState();
ButtonState();
lstSetpCaption.DataContext = m_WizardSteps;
m_view = (ListCollectionView)CollectionViewSource.GetDefaultView(lstSetpCaption.DataContext);
m_view.CurrentChanged += new EventHandler(view_CurrentChanged);
MoveNext(m_currentSetp);
}
void view_CurrentChanged(object sender, EventArgs e)
{
lstSetpCaption.SelectedIndex = m_view.CurrentPosition;
}
/// <summary>
/// 添加向导步骤
/// </summary>
/// <param name="pWF"></param>
public void AddStepControl(IWizardFramework pWF)
{
m_WizardSteps.Add(pWF);
}
/// <summary>
///向导模式
/// </summary>
private void SetWizardMode()
{
switch (this.m_model)
{
case WizardModel.SimpleModel:
this.btnExecute.Visibility = Visibility.Collapsed;
break;
case WizardModel.StepSettingModel:
this.btnExecute.Visibility = Visibility.Collapsed;
break;
case WizardModel.OneKeyModel:
this.btnMovePrevious.Visibility = Visibility.Hidden;
this.btnMoveNext.Visibility = Visibility.Hidden;
this.btnFinish.Visibility = Visibility.Hidden;
break;
}
}
/// <summary>
/// 判断PlugList列表是否为空
/// </summary>
/// <returns></returns>
private bool IsValidate()
{
if (m_WizardSteps.Count != 0)
{
return true;
}
else
{
return false;
}
}
#region 按钮方法
#region 添加
/// <summary>
/// 上一步
/// </summary>
/// <returns></returns>
private void MoveToFirstView()
{
if (m_currentSetp == 0)
{
return;
}
--m_currentSetp;
SetState();
ButtonState();
if (m_currentSetp > -1 && m_currentSetp <= m_WizardSteps.Count - 1)
{
this.PluginArea.Children.Clear();
this.FinishBtnName = m_prefilishBtnName;
m_WizardSteps[m_currentSetp].Intializing();
this.PluginArea.Children.Add((UIElement)m_WizardSteps[0]);
this.lblWizardCaption.Content = m_WizardSteps[0].Caption;
this.txtDescription.Text = m_WizardSteps[0].Description;
m_currentSetp = 0;
}
else
{
return;
}
}
#endregion
/// <summary>
/// 上一步
/// </summary>
/// <returns></returns>
private void MovePrevious()
{
if (m_currentSetp == 0)
{
return;
}
--m_currentSetp;
SetState();
ButtonState();
//************************************************//
//this.MoveNext(m_currentSetp);
if (m_currentSetp > -1 && m_currentSetp <= m_WizardSteps.Count - 1)
{
this.PluginArea.Children.Clear();
//m_WizardSteps[m_currentSetp].Intializing();
this.PluginArea.Children.Add((UIElement)m_WizardSteps[m_currentSetp]);
this.lblWizardCaption.Content = m_WizardSteps[m_currentSetp].Caption;
this.txtDescription.Text = m_WizardSteps[m_currentSetp].Description;
//**************修改**********************************//
if (this.m_isSucessFinsh)//点击执行成功后放回,则进入下一轮执行期
{
this.FinishBtnName = m_prefilishBtnName;
this.m_isSucessFinsh = false;
}
}
else
{
return;
}
//************************************************//
}
/// <summary>
/// 下一步
/// </summary>
/// <returns></returns>
private void MoveNext(int currentStep)
{
if (m_currentSetp > -1 && m_currentSetp <= m_WizardSteps.Count - 1)
{
this.PluginArea.Children.Clear();
m_WizardSteps[m_currentSetp].Intializing();
this.PluginArea.Children.Add((UIElement)m_WizardSteps[m_currentSetp]);
this.lblWizardCaption.Content = m_WizardSteps[m_currentSetp].Caption;
this.txtDescription.Text = m_WizardSteps[m_currentSetp].Description;
}
else
{
return;
}
}
/// <summary>
/// 取消
/// </summary>
private void Cancel()
{
System.Windows.Forms.DialogResult result = MessageHelper.ShowYesNoAndTips("是否要确实退出该向导操作?");
bool dResult = (result == System.Windows.Forms.DialogResult.Yes);
if (dResult)
{
PluginArea.Children.Clear();
Close();
}
}
/// <summary>
/// 完成
/// </summary>
private bool Finish()
{
m_isSucessFinsh = false;
if (!IsValidate()) return false;
if (m_WizardSteps[m_currentSetp].Validating())
{
//this.Cursor = Cursors.Wait;
this.btnMovePrevious.IsEnabled = false;
this.btnFinish.IsEnabled = false;
this.btnExecute.IsEnabled = false;
if (m_WizardSteps[m_currentSetp] is IWizardFrameworkExeState)
{
(m_WizardSteps[m_currentSetp] as IWizardFrameworkExeState).ExeStateCallBacK = (p) =>
{
if (p is ExeState)
{
switch (p)
{
case ExeState.Start:
this.btnMovePrevious.IsEnabled = false;
this.btnFinish.IsEnabled = false;
this.btnExecute.IsEnabled = false;
this.btnSkip.IsEnabled = false;
this.btnMoveNext.IsEnabled = false;
this.btnCancel.IsEnabled = false;
break;
case ExeState.Fail:
this.btnMovePrevious.IsEnabled = true;
this.btnFinish.IsEnabled = true;
this.btnExecute.IsEnabled = true;
break;
case ExeState.Success:
this.btnMovePrevious.IsEnabled = true;
this.btnFinish.IsEnabled = true;
this.btnExecute.IsEnabled = true;
break;
default:
break;
}
}
};
}
if (m_WizardSteps[m_currentSetp].Execute())
{
//this.btnMovePrevious.IsEnabled = true;
//this.btnFinish.IsEnabled = true;
//this.btnExecute.IsEnabled = true;
if (m_WizardSteps[m_currentSetp].IsFinalSuccess)
{
//MessageBoxResult result = MessageBox.Show("向导运行成功,是否关闭该向导", "提示", MessageBoxButton.YesNo, MessageBoxImage.Question);
//bool dResult = (result == MessageBoxResult.Yes);
//if (dResult)
//{
// PluginArea.Children.Clear();
// Close();
//}
return true;
}
else
{
//MessageBoxResult result = MessageBox.Show("向导运行失败,是否继续该向导", "提示", MessageBoxButton.YesNo, MessageBoxImage.Question);
//bool dResult = (result == MessageBoxResult.Yes);
System.Windows.Forms.DialogResult result = MessageHelper.ShowYesNoAndError("向导运行失败,是否继续该向导?");
bool dResult = (result == System.Windows.Forms.DialogResult.Yes);
if (!dResult)
{
PluginArea.Children.Clear();
Close();
}
}
}
}
return false;
//else
//{
// MessageBox.Show("信息不能为空,请选择!", "提示");
//}
//this.Cursor = Cursors.Arrow;
}
private bool FinishAll()
{
try
{
#region 验证最后一步是否可执行
var Lastitem = m_WizardSteps.FindLast(x => x.Validating());
//if (!Lastitem.IsFinalSuccess)
// return false;
TextBox txtlog = Lastitem.Parameter as TextBox;
Lastitem.Parameter = null;
#endregion
m_isSucessFinsh = false;
if (!IsValidate()) return false;
this.btnMovePrevious.IsEnabled = false;
this.btnFinish.IsEnabled = false;
this.btnExecute.IsEnabled = false;
IDGParameter iDGParameter = null;
bool isExeGPForProces = false;
//this.ShowLoading("正在执行请稍候...", 0, 0);
foreach (var item in m_WizardSteps)
{
if (item.IsSkip) continue;
if (item.Parameter != null)
{
if (iDGParameter == null)
{
iDGParameter = new IDGParameter();
iDGParameter.StrProjInfo = (item.Parameter as IDGParameter).StrProjInfo;
}
if ((item.Parameter as IDGParameter).ExeDLTB)
{
iDGParameter.ExeDLTB = true;
}
if ((item.Parameter as IDGParameter).ExeCJDCQ || (item.Parameter as IDGParameter).ExeXZQ || (item.Parameter as IDGParameter).ExeGDDB)
{
iDGParameter.ExeCJDCQ = (item.Parameter as IDGParameter).ExeCJDCQ == true;
iDGParameter.ExeXZQ = (item.Parameter as IDGParameter).ExeXZQ == true;
iDGParameter.ExeGDDB = (item.Parameter as IDGParameter).ExeGDDB == true;
}
if ((item.Parameter as IDGParameter).ExeCZC)
{
iDGParameter.ExeCZC = (item.Parameter as IDGParameter).ExeCZC == true;
}
if ((item.Parameter as IDGParameter).ExeZLHZ)
{
iDGParameter.ExeZLHZ = (item.Parameter as IDGParameter).ExeZLHZ == true;
}
}
else
{
if (iDGParameter != null && isExeGPForProces == false)
{
string result = ProcesHelper.Instance.ExeGPForProces(iDGParameter, txtlog);
if (result.Contains("Err"))
{
MessageHelper.ShowTips($"执行失败!:{result}");
return false;
}
isExeGPForProces = true;
}
if (item.Execute())
{
}
else
{
LogAPI.Debug("执行失败");
MessageHelper.ShowTips("执行失败!");
return true;
}
}
//Thread.Sleep(2000);
}
//this.CloseLoading();
MessageHelper.ShowTips("执行完成!");
this.btnMovePrevious.IsEnabled = true;
this.btnFinish.IsEnabled = true;
this.btnExecute.IsEnabled = true;
return true;
}
catch (Exception ex)
{
//this.CloseLoading();
LogAPI.Debug("执行失败");
MessageHelper.ShowError(ex.Message);
}
finally
{
//this.CloseLoading();
}
return false;
}
#endregion
#region 向导状态
/// <summary>
/// 设置当前向导状态
/// </summary>
protected void SetState()
{
if (m_WizardSteps.Count == 0)
{
m_state = WizardState.Uninitialized;
}
else if (m_WizardSteps.Count - 1 == m_currentSetp)
{
m_state = WizardState.End;
}
else if (m_currentSetp == 0)
{
m_state = WizardState.Start;
}
else
{
m_state = WizardState.Middle;
}
}
/// <summary>
/// 设置Button状态
/// </summary>
/// <param name="btn"></param>
/// <param name="isEnabled"></param>
protected void SetButtonState(Button btn, bool isEnabled)
{
if (btn != null)
{
btn.IsEnabled = isEnabled;
}
}
/// <summary>
/// 监听当前向导状态
/// </summary>
protected void ButtonState()
{
switch (this.State)
{
case WizardState.Uninitialized:
SetButtonState(this.btnMovePrevious, false);
SetButtonState(this.btnMoveNext, false);
SetButtonState(this.btnFinish, false);
SetButtonState(this.btnSkip, false);
SetButtonState(this.btnCancel, true);
break;
case WizardState.Start:
SetButtonState(this.btnMovePrevious, false);
SetButtonState(this.btnMoveNext, true);
SetButtonState(this.btnFinish, false);
SetButtonState(this.btnSkip, true);
SetButtonState(this.btnCancel, true);
break;
case WizardState.Middle:
SetButtonState(this.btnMovePrevious, true);
SetButtonState(this.btnMoveNext, true);
SetButtonState(this.btnSkip, true);
SetButtonState(this.btnFinish, false);
SetButtonState(this.btnCancel, true);
break;
case WizardState.End:
SetButtonState(this.btnMovePrevious, true);
SetButtonState(this.btnMoveNext, false);
SetButtonState(this.btnSkip, false);
SetButtonState(this.btnFinish, true);
SetButtonState(this.btnCancel, true);
break;
}
}
#endregion
private void btnMoveNext_Click(object sender, RoutedEventArgs e)
{
if (!IsValidate()) return;
if (m_WizardSteps[m_currentSetp].Validating())
{
this.Cursor = Cursors.Wait;
if (this.Model == WizardModel.SimpleModel)
{
if (m_WizardSteps[m_currentSetp].Execute())
{
++m_currentSetp;
SetState();
ButtonState();
this.MoveNext(m_currentSetp);
m_view.MoveCurrentToNext();//ListBoxItem向下移动一次
}
else
{
return;
}
}
else if (this.Model == WizardModel.StepSettingModel)
{
++m_currentSetp;
SetState();
ButtonState();
this.MoveNext(m_currentSetp);
m_view.MoveCurrentToNext();//ListBoxItem向下移动一次
}
}
//else
//{
// MessageBox.Show("信息不能为空,请选择!", "提示");
//}
this.Cursor = Cursors.Arrow;
}
private void btnMovePrevious_Click(object sender, RoutedEventArgs e)
{
//************************************************//
m_WizardSteps[m_currentSetp].Back();
//************************************************//
MovePrevious();
m_view.MoveCurrentToPrevious();
}
private void btnCancel_Click(object sender, RoutedEventArgs e)
{
Cancel();
}
private void btnFinish_Click(object sender, RoutedEventArgs e)
{
if (m_isSucessFinsh)
{
Close();
return;
}
this.Cursor = Cursors.Wait;
switch (this.Model)
{
case WizardModel.SimpleModel:
if (Finish())
{
this.FinishBtnName = "完成";
m_isSucessFinsh = true;
}
break;
case WizardModel.StepSettingModel:
if (Finish())//FinishAll
{
this.FinishBtnName = "完成";
m_isSucessFinsh = true;
}
break;
case WizardModel.OneKeyModel:
if (Finish())
{
this.FinishBtnName = "完成";
m_isSucessFinsh = true;
}
break;
default:
break;
}
this.Cursor = Cursors.Arrow;
}
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (Model == WizardModel.OneKeyModel)
{
PluginArea.Children.Clear();
int index = ((ListBox)sender).SelectedIndex;
this.lblWizardCaption.Content = m_WizardSteps[index].Caption;
this.txtDescription.Text = m_WizardSteps[index].Description;
m_WizardSteps[index].Intializing();
this.PluginArea.Children.Add((UIElement)m_WizardSteps[index]);
}
}
private void btnExecute_Click(object sender, RoutedEventArgs e)
{
try
{
if (ValidateAllSeteps())
{
this.btnExecute.IsEnabled = false;
bool ExecuteResult = ExcuteAllSteps();
if (ExecuteResult)
{
this.btnExecute.IsEnabled = true;
m_view.MoveCurrentToFirst();
MessageHelper.ShowTips("执行成功!");
}
}
}
catch (Exception ex)
{
MessageHelper.ShowError(ex.Message);
}
this.btnExecute.IsEnabled = true;
}
private bool ValidateAllSeteps()
{
int setpCount = -1;
bool validateResult = false;
foreach (IWizardFramework wizard in m_WizardSteps)
{
++setpCount;
lstSetpCaption.SelectedIndex = setpCount;
validateResult = wizard.Validating();
//m_view.MoveCurrentToNext();
if (!validateResult)
{
//m_view.MoveCurrentToPrevious();
lstSetpCaption.SelectedIndex = setpCount;
return false;
}
}
return validateResult;
}
private bool ExcuteAllSteps()
{
int setpCount = -1;
bool validateReslut = false;
foreach (IWizardFramework wizard in m_WizardSteps)
{
++setpCount;
lstSetpCaption.SelectedIndex = setpCount;
validateReslut = wizard.Execute();
//m_view.MoveCurrentToNext();
if (!validateReslut)
{
//m_view.MoveCurrentToPrevious();
lstSetpCaption.SelectedIndex = setpCount;
return false;
}
}
return validateReslut;
}
private void btnSkip_Click(object sender, RoutedEventArgs e)
{
if (!IsValidate()) return;
m_WizardSteps[m_currentSetp].Intializing(true);
this.Cursor = Cursors.Wait;
++m_currentSetp;
SetState();
ButtonState();
this.MoveNext(m_currentSetp);
m_view.MoveCurrentToNext();
this.Cursor = Cursors.Arrow;
}
}
public class ProcesHelper
{
public static ProcesHelper Instance { get; } = new ProcesHelper();
private ProcesHelper() { }
public Action<object> ProgressHandle { get; set; }
public string ExeGPForProces(string arg, TextBox textBox)
{
Byte[] toEncryptArray = Encoding.UTF8.GetBytes(arg);
string strParm = Convert.ToBase64String(toEncryptArray);
var psi = new ProcessStartInfo("IDGForNDBG.exe", strParm);
psi.UseShellExecute = false;
psi.CreateNoWindow = true;
psi.RedirectStandardError = true;
psi.RedirectStandardInput = true;
psi.RedirectStandardOutput = true;
var pes = Process.Start(psi);
var sbuffer = new StringBuilder();
var sout = pes.StandardOutput;
while (!sout.EndOfStream)
{
var line = sout.ReadLine();
if (String.IsNullOrEmpty(line)) continue;
sbuffer.AppendLine(line);
if (line.StartsWith("Msg:"))
{
ProgressHandle?.Invoke(line.Replace("Msg:", ""));
}
else
{
LogAPI.Debug(line);
}
if (line.StartsWith("Msg:"))
{
//textBox.Text.
this.UpdateMsg($"正在执行{line.Replace("Msg:", "")}...");
}
}
pes.WaitForExit();
pes.Close();
String res = sbuffer.ToString();
sbuffer.Clear();
return res;
}
string outPath = string.Empty;
public string ExeGPForProces(IDGParameter gPParam, TextBox textBox)
{
string result = string.Empty;
try
{
string strParm = SerializeAPI.SerializeToXML<IDGParameter>(gPParam);
result = ExeGPForProces(strParm, textBox);
}
catch (Exception ex)
{
result = ex.Message;
Console.WriteLine(result);
Console.WriteLine(ex.Message);
}
return result;
}
}
}