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.

291 lines
11 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using Newtonsoft.Json;
using Prism.Commands;
using Prism.Ioc;
using Prism.Mvvm;
using Prism.Services.Dialogs;
using StartServerWPF.Models;
using StartServerWPF.Modules.Main.Models;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
namespace StartServerWPF.Modules.Main.ViewModels
{
public class DataProcessViewModel : BindableBase
{
public DataProcessViewModel(MainViewModel mainViewModel, SystemConfigModel configModel, WorkareaModelArray modelArray)
{
this._mainViewModel = mainViewModel;
this._systemConfig = configModel;
this.modelArray = modelArray;
}
private string _title = "应用列表";
public string Title => _title;
private readonly MainViewModel _mainViewModel;
private SystemConfigModel _systemConfig;
private readonly WorkareaModelArray modelArray;
private WorkareaModel _workareaModel;
private string _dataPath;
public string DataPath
{
get => _dataPath;
set { SetProperty(ref _dataPath, value); }
}
private string _savePath;
public string SavePath
{
get => _savePath;
set { SetProperty(ref _savePath, value); }
}
private DateTime _startSelectedDate;
public DateTime StartSelectedDate
{
get => _startSelectedDate;
set { SetProperty(ref _startSelectedDate, value); }
}
private DateTime _endSelectedDate;
public DateTime EndSelectedDate
{
get => _endSelectedDate;
set { SetProperty(ref _endSelectedDate, value); }
}
private int _wareaSelectedIndex;
public int WareaSelectedIndex
{
get => _wareaSelectedIndex;
set
{
if (value >= 0)
{
_workareaModel = modelArray.workarea[value];
}
SetProperty(ref _wareaSelectedIndex, value);
}
}
private ObservableCollection<string> _workareaNameSource;
public ObservableCollection<string> WorkareaNameSource
{
get => _workareaNameSource;
set { SetProperty(ref _workareaNameSource, value); }
}
private ObservableCollection<MsEventModel> _apmsEventSource = new ObservableCollection<MsEventModel>();
public ObservableCollection<MsEventModel> ApmsEventSource
{
get => _apmsEventSource;
set => SetProperty(ref _apmsEventSource, value);
}
public DelegateCommand LoadedCommand => new(() =>
{
StartSelectedDate = DateTime.Now;
EndSelectedDate = DateTime.Now;
this._workareaModel = modelArray.workarea[modelArray.selectIndex];
WorkareaNameSource = new ObservableCollection<string>();
modelArray.workarea.Select(n => n.workareaname).ToList().ForEach(a => WorkareaNameSource.Add(a));
WareaSelectedIndex = modelArray.selectIndex;
});
public DelegateCommand<object> SelectFileCommand => new((obj) =>
{
string para = obj.ToString();
System.Windows.Forms.FolderBrowserDialog fbd = new System.Windows.Forms.FolderBrowserDialog();
// fbd.SelectedPath = MainModel.DataSavePath;
fbd.ShowNewFolderButton = true;
if (fbd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
string path = fbd.SelectedPath.Replace("\\", "/");
if (para == "SavePath")
{
SavePath = path;
}
else if (para == "DataPath")
{
DataPath = path;
}
}
});
public ICommand StartCommand
{
get => new DelegateCommand(() =>
{
// 数据校验关键字段不能为空、年龄做数字区间的校验、做UserName的唯一检查自定义特性检查
if (string.IsNullOrEmpty(DataPath) || string.IsNullOrEmpty(SavePath))
{
MessageBox.Show("内容不能为空", "提示", MessageBoxButton.OK);
return;
}
if (MessageBox.Show("确认修改?", "参数设置", MessageBoxButton.OKCancel,
MessageBoxImage.Exclamation) == MessageBoxResult.OK)
{
var time = (EndSelectedDate - StartSelectedDate);
if (time.TotalMinutes < 1)
{
MessageBox.Show("结束时间必需大于开始时间", "提示", MessageBoxButton.OK);
return;
}
DateTime dateTime = StartSelectedDate;
string temPath = Path.GetPathRoot( _workareaModel.savepath) + "temPath";
if (!Directory.Exists(temPath))
{
Directory.CreateDirectory(temPath);
}
while ((EndSelectedDate - dateTime).TotalMinutes >= 1)
{
string path = Path.GetFullPath($"{DataPath}\\{dateTime.Month.ToString().PadLeft(2, '0')}\\{dateTime.Day.ToString().PadLeft(2, '0')}\\{dateTime.Hour.ToString().PadLeft(2, '0')}\\{dateTime.Minute.ToString().PadLeft(2, '0')}");
dateTime= dateTime.AddMinutes(1);
if( !Directory.Exists(path))
{
continue;
}
var mseedFiles = new DirectoryInfo(path).EnumerateFiles("*.mseed");
// var mseedFiles = files.Where(i => i.Extension == ".mseed");
Parallel.ForEach(mseedFiles, (item) =>
{
Debug.WriteLine($"***************path:{path},{item.FullName}");
File.Copy(item.FullName, Path.Combine( temPath, item.Name), true);
});
}
ProcessInfo process = _systemConfig.dataProTools;
int index = process.ProParams.IndexOf("-wave");
string str = process.ProParams.Substring(0, index) + "-wave";
process.ProParams = $"{str} {temPath}";
//gw.tools.exe配置更新
ApmsModel tools = _workareaModel.apmModel;
// tools.savepath = SavePath; // _workareaModel.savepath + "/" +SavePath;;
tools.station = Path.GetFullPath(Path.Combine(JsonParser.workareaPath, _workareaModel.apmModel.station)).Replace("\\", "/");
tools.ttime[0].ttime2d = Path.GetFullPath(Path.Combine(JsonParser.workareaPath, _workareaModel.apmModel.ttime[0].ttime2d)).Replace("\\", "/");
tools.push2wx = _workareaModel.toolpush2wx ? "YES" : "NO";
tools.channels = new List<StationChannelsModel>
{
new StationChannelsModel()
{
location = _workareaModel.StationConfig.Location,
network = _workareaModel.StationConfig.Network,
channels = _workareaModel.StationConfig.Channels,
station = string.Join(",", _workareaModel.StationConfig.Stations.Where(p => p.IsEnable).Select(n => n.Name))
}
};
JsonParser.WriteSystemConfigFile(Path.Combine(_systemConfig.dataProTools.ProPath, "apms.json"), tools);
this.StartProcess(process);
}
});
}
private bool CMDStartProcess(ProcessInfo proInfo)
{
//* Create your Process
Process process = new Process();
process.Exited += Process_Exited;
process.EnableRaisingEvents = true;
process.StartInfo.FileName = Path.GetFullPath(proInfo.ProPath + proInfo.ProName + ".exe");
process.StartInfo.WorkingDirectory = Path.GetFullPath(proInfo.ProPath);
process.StartInfo.Arguments = proInfo.ProParams;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.CreateNoWindow = true;
//* Set your output and error (asynchronous) handlers
//* Start process and handlers
bool res = process.Start();
// process.WaitForExit();
return res;
}
private void Process_Exited(object? sender, EventArgs e)
{
var fileName = Directory.GetFiles(SavePath, "*.index");
if (!File.Exists( fileName.FirstOrDefault()))
{
return;
}
string[] text = File.ReadAllLines(fileName.FirstOrDefault());
Application.Current.Dispatcher.BeginInvoke(() =>
{
foreach (var item in text)
{
ApmsEventSource.Add(new MsEventModel(item));
}
});
}
/// <summary>
/// 启动进程
/// </summary>
/// <param name="proInfo"></param>
/// <returns>进程启动返回值</returns>
public int StartProcess(ProcessInfo proInfo)
{
bool res = CMDStartProcess(proInfo);
int seInd = res ? 0 : 37;
return seInd;
}
/// <summary>
/// 结束进程
/// </summary>
/// <param name="processInfo"></param>
/// <returns>0=成功;1=未找到进程;-1=失败</returns>
public int KillProcess(ProcessInfo processInfo)
{
int ri = 0;
if (processInfo != null)
{
if (processInfo.ProName != null)
{
try
{
Process[] localByName = Process.GetProcessesByName(processInfo.ProName);
if (localByName.Length == 0)
{
ri = 1;
return ri;
}
foreach (var item in localByName)
{
Console.WriteLine(item.Id);
item.Kill();
}
return ri;
}
catch (Exception)
{
return -1;
}
}
else
{
return 0;
}
}
else
{
return 0;
}
}
}
}