using System; using System.Collections.Generic; using System.Drawing.Imaging; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Automation.Text; 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 Microsoft.Extensions.DependencyInjection; using Sln.Wcs.Model.Domain; using Sln_Wpf.Page.AddWindows; using SqlSugar; namespace Sln_Wpf.Page { /// /// TaskInfo.xaml 的交互逻辑 /// public partial class TaskInfo : UserControl { private List _taskTypes; private List _subtasks; private List _wcsTask; private BaseTasktypeInfo _selectedTaskType; private BaseSubtaskTemplate _selectedSubtask; private WcsTaskInstance _selectedTaskInstance; private ISqlSugarClient? sqlSugarClient; public TaskInfo() { InitializeComponent(); sqlSugarClient = App.ServiceProvider.GetService(); sqlSugarClient.AsTenant().ChangeDatabase("wcs"); _wcsTask = sqlSugarClient.Queryable().ToList(); _taskTypes = sqlSugarClient.Queryable().ToList(); _subtasks = sqlSugarClient.Queryable().ToList(); BindTaskTypeData(); BindSubtaskData(); BindTaskInstanceData(); LoadFilters(); } private void BindTaskInstanceData() { var displayData = _wcsTask.Select(t => new { t.TaskCode, t.TaskName, t.TaskTypeName, Status = GetStatusText(t.Status), PriorityText = GetPriorityText(t.Priority), t.SourceLocation, t.TargetLocation, t.MaterialCode, t.MaterialName, t.SubtaskCount, t.CurrentSubtaskCode, t.ResultCode, t.ErrorMessage, CreateTime = t.CreateTime.ToString("yyyy-MM-dd HH:mm:ss"), UpdateTime = t.UpdateTime.ToString("yyyy-MM-dd HH:mm:ss") }).ToList(); TaskDataGrid.ItemsSource = displayData; } public static string GetPriorityText(int? priority) { switch (priority) { case 0: return "普通"; case 1: return "较高"; case 2: return "高"; case 3: return "最高"; default: return "普通"; } } private string GetStatusText(string status) { switch (status) { case "RUNNING": return "执行中"; case "ERROR": return "异常"; default: return status ?? "未知"; } } private void BindTaskTypeData() { var displayData = _taskTypes.Select(t => new { t.TaskTypeName, t.TaskTypeKey, t.TaskTypeValue, t.UseFlag, t.AgvType, t.AgvTaskType }).ToList(); TaskTypeDataGrid.ItemsSource = displayData; } private void BindSubtaskData() { var displayData = _subtasks.Select(s => new { s.SubtaskCode, s.SubtaskName, s.SubtaskType, s.DeviceType, s.DeviceAction, s.SourceLocationType, s.SourceLocationCode, s.TargetLocationType, s.TargetLocationCode, s.MaterialAction, s.ContainerType, s.IsCarryMaterial, s.Status }).ToList(); SubtaskDataGrid.ItemsSource = displayData; } private void LoadFilters() { // 加载任务类型筛选 var parentTypes = _subtasks.Select(s => s.SubtaskType).Distinct().ToList(); FilterParentTaskType.Items.Clear(); FilterParentTaskType.Items.Add("全部任务类型"); foreach (var type in parentTypes) { FilterParentTaskType.Items.Add(type); } } private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e) { //UpdateStats(); } #region 任务类型事件 private void BtnTaskAdd_Click(object sender, RoutedEventArgs e) { var addWindow = new AddTaskWindow(); addWindow.Owner = Window.GetWindow(this); if (addWindow.ShowDialog() == true) { _wcsTask.Add(addWindow.NewTask); BindTaskInstanceData(); MessageBox.Show($"任务类型 {addWindow.NewTask.TaskTypeName} 添加成功!", "添加成功", MessageBoxButton.OK, MessageBoxImage.Information); } } private void BtnTaskDelete_Click(object sender, RoutedEventArgs e) { if (_selectedTaskInstance == null) { MessageBox.Show("请先选择要删除的任务", "提示", MessageBoxButton.OK, MessageBoxImage.Warning); return; } var result = MessageBox.Show($"确定要删除任务 {_selectedTaskInstance.TaskName} 吗?\n删除后关联的子任务也会被删除。", "确认删除", MessageBoxButton.YesNo, MessageBoxImage.Question); if (result == MessageBoxResult.Yes) { // 删除关联的子任务 _wcsTask.Remove(_selectedTaskInstance); var flag = sqlSugarClient.Deleteable().Where(d => d.TaskCode == _selectedTaskInstance.TaskCode).ExecuteCommand(); var flag1 = sqlSugarClient.Deleteable().Where(d => d.MaintaskCode == _selectedTaskInstance.TaskCode).ExecuteCommand(); BindTaskInstanceData(); BindSubtaskData(); LoadFilters(); _selectedTaskInstance = null; if (flag > 0 && flag1 > 0) MessageBox.Show("删除成功", "提示", MessageBoxButton.OK, MessageBoxImage.Information); } } private void ExceptionTaskEdit_Click(object sender, RoutedEventArgs e) { if (_selectedTaskInstance == null) { MessageBox.Show("请先选择要重置的任务", "提示", MessageBoxButton.OK, MessageBoxImage.Warning); return; } var result = MessageBox.Show($"确定要重置任务 {_selectedTaskInstance.TaskName} 吗?", "确认重置", MessageBoxButton.YesNo, MessageBoxImage.Question); if (result == MessageBoxResult.Yes) { // 重置关联的子任务 var flag = sqlSugarClient.Updateable().Where(it => it.MaintaskCode == _selectedTaskInstance.TaskCode).SetColumns(it => new SubTaskInstance() { TaskStatus = 0, }).ExecuteCommand(); sqlSugarClient.Updateable().Where(it => it.TaskCode == _selectedTaskInstance.TaskCode).SetColumns(it => new WcsTaskInstance() { Status = "RUNNING", }).ExecuteCommand(); BindTaskInstanceData(); BindSubtaskData(); LoadFilters(); _selectedTaskInstance = null; if (flag > 0) MessageBox.Show("重置成功", "提示", MessageBoxButton.OK, MessageBoxImage.Information); } } private void TaskDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) { var selected = TaskDataGrid.SelectedItem; if (selected != null) { var taskCode = selected.GetType().GetProperty("TaskCode")?.GetValue(selected)?.ToString(); _selectedTaskInstance = _wcsTask.FirstOrDefault(t => t.TaskCode == taskCode); } } private void BtnTaskTypeAdd_Click(object sender, RoutedEventArgs e) { var addWindow = new AddTaskTypeWindow(); addWindow.Owner = Window.GetWindow(this); if (addWindow.ShowDialog() == true) { _taskTypes.Add(addWindow.NewTaskType); BindTaskTypeData(); MessageBox.Show($"任务类型 {addWindow.NewTaskType.TaskTypeName} 添加成功!", "添加成功", MessageBoxButton.OK, MessageBoxImage.Information); } } private void BtnTaskTypeEdit_Click(object sender, RoutedEventArgs e) { if (_selectedTaskType == null) { MessageBox.Show("请先选择要编辑的任务类型", "提示", MessageBoxButton.OK, MessageBoxImage.Warning); return; } var editWindow = new AddTaskTypeWindow(_selectedTaskType); editWindow.Owner = Window.GetWindow(this); if (editWindow.ShowDialog() == true) { var updated = editWindow.NewTaskType; _selectedTaskType.TaskTypeName = updated.TaskTypeName; _selectedTaskType.TaskTypeKey = updated.TaskTypeKey; _selectedTaskType.TaskTypeValue = updated.TaskTypeValue; _selectedTaskType.UseFlag = updated.UseFlag; _selectedTaskType.AgvType = updated.AgvType; _selectedTaskType.AgvTaskType = updated.AgvTaskType; BindTaskTypeData(); MessageBox.Show("任务类型更新成功", "提示", MessageBoxButton.OK, MessageBoxImage.Information); } } private void BtnTaskTypeDelete_Click(object sender, RoutedEventArgs e) { if (_selectedTaskType == null) { MessageBox.Show("请先选择要删除的任务类型", "提示", MessageBoxButton.OK, MessageBoxImage.Warning); return; } var result = MessageBox.Show($"确定要删除任务类型 {_selectedTaskType.TaskTypeName} 吗?\n删除后关联的子任务也会被删除。", "确认删除", MessageBoxButton.YesNo, MessageBoxImage.Question); if (result == MessageBoxResult.Yes) { // 删除关联的子任务 _taskTypes.Remove(_selectedTaskType); var flag = sqlSugarClient.Deleteable().Where(d => d.TaskTypeKey == _selectedTaskType.TaskTypeKey).ExecuteCommand(); BindTaskTypeData(); BindSubtaskData(); LoadFilters(); _selectedTaskType = null; if (flag > 0) MessageBox.Show("删除成功", "提示", MessageBoxButton.OK, MessageBoxImage.Information); } } private void BtnTaskTypeQuery_Click(object sender, RoutedEventArgs e) { _taskTypes = sqlSugarClient.Queryable().ToList(); string keyword = SearchTaskTypeKeyword.Text; string filterFlag = FilterUseFlag.SelectedItem?.ToString(); var queryData = _taskTypes.AsEnumerable(); if (!string.IsNullOrEmpty(filterFlag) && filterFlag != "全部状态") { //queryData = queryData.Where(t => t.UseFlag == filterFlag); } if (!string.IsNullOrEmpty(keyword) && keyword != "请输入任务名称/编号") { queryData = queryData.Where(t => t.TaskTypeName.Contains(keyword) || t.TaskTypeKey.Contains(keyword)); } var displayData = queryData.Select(t => new { t.TaskTypeName, t.TaskTypeKey, t.TaskTypeValue, t.UseFlag, t.AgvType, t.AgvTaskType }).ToList(); TaskTypeDataGrid.ItemsSource = displayData; MessageBox.Show($"查询完成,共找到 {displayData.Count} 条记录", "查询结果", MessageBoxButton.OK, MessageBoxImage.Information); } private void TaskTypeDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) { var selected = TaskTypeDataGrid.SelectedItem; if (selected != null) { var taskTypeKey = selected.GetType().GetProperty("TaskTypeKey")?.GetValue(selected)?.ToString(); _selectedTaskType = _taskTypes.FirstOrDefault(t => t.TaskTypeKey == taskTypeKey); } } #endregion #region 子任务事件 private void BtnSubtaskAdd_Click(object sender, RoutedEventArgs e) { var addWindow = new AddSubtaskWindow(); addWindow.Owner = Window.GetWindow(this); if (addWindow.ShowDialog() == true) { _subtasks.Add(addWindow.NewSubtask); BindSubtaskData(); LoadFilters(); MessageBox.Show($"子任务 {addWindow.NewSubtask.SubtaskCode} 添加成功!", "添加成功", MessageBoxButton.OK, MessageBoxImage.Information); } } private void BtnSubtaskEdit_Click(object sender, RoutedEventArgs e) { if (_selectedSubtask == null) { MessageBox.Show("请先选择要编辑的子任务", "提示", MessageBoxButton.OK, MessageBoxImage.Warning); return; } var editWindow = new AddSubtaskWindow(_selectedSubtask); editWindow.Owner = Window.GetWindow(this); if (editWindow.ShowDialog() == true) { var updated = editWindow.NewSubtask; _selectedSubtask.SubtaskCode = updated.SubtaskCode; _selectedSubtask.SubtaskName = updated.SubtaskName; _selectedSubtask.SubtaskType = updated.SubtaskType; _selectedSubtask.DeviceType = updated.DeviceType; _selectedSubtask.DeviceAction = updated.DeviceAction; _selectedSubtask.SourceLocationType = updated.SourceLocationType; _selectedSubtask.SourceLocationCode = updated.SourceLocationCode; _selectedSubtask.TargetLocationType = updated.TargetLocationType; _selectedSubtask.TargetLocationCode = updated.TargetLocationCode; _selectedSubtask.MaterialAction = updated.MaterialAction; _selectedSubtask.ContainerType = updated.ContainerType; _selectedSubtask.IsCarryMaterial = updated.IsCarryMaterial; _selectedSubtask.Status = updated.Status; BindSubtaskData(); MessageBox.Show("子任务更新成功", "提示", MessageBoxButton.OK, MessageBoxImage.Information); } } private void BtnSubtaskDelete_Click(object sender, RoutedEventArgs e) { if (_selectedSubtask == null) { MessageBox.Show("请先选择要删除的子任务", "提示", MessageBoxButton.OK, MessageBoxImage.Warning); return; } var result = MessageBox.Show($"确定要删除子任务 {_selectedSubtask.SubtaskCode} {_selectedSubtask.SubtaskName} 吗?", "确认删除", MessageBoxButton.YesNo, MessageBoxImage.Question); if (result == MessageBoxResult.Yes) { var flag = sqlSugarClient.Deleteable().Where(d => d.SubtaskCode == _selectedSubtask.SubtaskCode).ExecuteCommand(); if (flag > 0) { _subtasks.Remove(_selectedSubtask); BindSubtaskData(); LoadFilters(); _selectedSubtask = null; MessageBox.Show("删除成功", "提示", MessageBoxButton.OK, MessageBoxImage.Information); } } } private void BtnSubtaskQuery_Click(object sender, RoutedEventArgs e) { string keyword = SearchSubtaskKeyword.Text; string filterParent = FilterParentTaskType.SelectedItem?.ToString(); string filterStatus = FilterSubtaskStatus.SelectedItem?.ToString(); var queryData = _subtasks.AsEnumerable(); if (!string.IsNullOrEmpty(filterParent) && filterParent != "全部任务类型") { queryData = queryData.Where(s => s.SubtaskType == filterParent); } if (!string.IsNullOrEmpty(filterStatus) && filterStatus != "全部状态") { //queryData = queryData.Where(s => s.Status == filterStatus); } if (!string.IsNullOrEmpty(keyword) && keyword != "请输入子任务编码/名称") { queryData = queryData.Where(s => s.SubtaskCode.Contains(keyword) || s.SubtaskName.Contains(keyword)); } var displayData = queryData.Select(s => new { s.SubtaskCode, s.SubtaskName, s.SubtaskType, s.DeviceType, s.DeviceAction, s.SourceLocationType, s.SourceLocationCode, s.TargetLocationType, s.TargetLocationCode, s.MaterialAction, s.ContainerType, s.IsCarryMaterial, s.Status }).ToList(); SubtaskDataGrid.ItemsSource = displayData; MessageBox.Show($"查询完成,共找到 {displayData.Count} 条记录", "查询结果", MessageBoxButton.OK, MessageBoxImage.Information); } private void SubtaskDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) { var selected = SubtaskDataGrid.SelectedItem; if (selected != null) { var subtaskCode = selected.GetType().GetProperty("SubtaskCode")?.GetValue(selected)?.ToString(); _selectedSubtask = _subtasks.FirstOrDefault(s => s.SubtaskCode == subtaskCode); } } #endregion } }