using GalaSoft.MvvmLight.Command; using Microsoft.AspNetCore.Components.Forms; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.IdentityModel.Protocols; using NVelocity.Util.Introspection; using SlnMesnac.Business; using SlnMesnac.Business.business; using SlnMesnac.Model.domain; using SlnMesnac.Model.dto; using SlnMesnac.Repository.service; using SlnMesnac.WPF.Page; using SlnMesnac.WPF.Views; using SqlSugar; using System; using System.CodeDom.Compiler; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Configuration; using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Documents; using System.Windows.Input; namespace SlnMesnac.WPF.ViewModel { public class ExecuteViewModel : INotifyPropertyChanged { private readonly ILogger _logger; public ObservableCollection OrderCodeComboBoxItems { get; set; } public ObservableCollection PlanCodeComboBoxItems { get; set; } public ObservableCollection MaterialNameComboBoxItems { get; set; } private RfidHandleBusniess _RfidHandleBusniess; private DatabaseHandleBusniess _databaseHandleBusniess; private ProdPlanInfoService _prodPlanInfoService; private List prodPlanInfos; private ProdPlanDetailService _prodPlanDetailService; private IRecordStaffAttendanceService _recordStaffAttendanceService; private IBaseStaffService _baseStaffService; //private string StationCode; private string DeviceCode; private string ProcessCode; public static bool isComplete = true; public static string theStartTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");//记录每个明细的开始时间 public static int stations = 0; private string theOrderCode = ""; private ProdPLanInfo pLanInfo; private ProdPLanInfo haveInfo; private SerialPortBusiness _serialPortBusiness; private string executeText = "待执行"; private int isSearch = 0; #region 定义命令 /// /// 检索命令 /// public ICommand SearchCommand { get; private set; } /// /// 换班命令 /// public ICommand HandoverCommand { get; private set; } /// /// 报工命令 /// public ICommand ProductionReportCommand { get; private set; } /// /// 工艺信息命令 /// public ICommand TechnologicalInformationCommand { get; private set; } /// /// 执行命令 /// public ICommand ExecuteCommand { get; private set; } #endregion #region 定义委托 public delegate void RefreshDelegate(ProdPLanInfo pLanInfo); public static event RefreshDelegate? RefreshEvent; /// /// 按钮文字转换事件 /// public event PropertyChangedEventHandler PropertyChanged = delegate { }; #endregion #region 定义属性 /// /// 班组成员 /// private string teamMember; public string TeamMember { get { return teamMember; } set { teamMember = value; OnPropertyChanged("TeamMember"); } } /// /// 订单 /// private string orderCodeTextBox; public string OrderCodeTextBox { get { return orderCodeTextBox; } set { orderCodeTextBox = value; OnPropertyChanged("OrderCodeTextBox"); } } /// /// 工单 /// private string planCodeTextBox; public string PlanCodeTextBox { get { return planCodeTextBox; } set { planCodeTextBox = value; OnPropertyChanged("PlanCodeTextBox"); } } /// /// 原料 /// private string materialCodeTextBox; public string MaterialCodeTextBox { get { return materialCodeTextBox; } set { materialCodeTextBox = value; OnPropertyChanged("MaterialNameTextBox"); } } /// /// 工位 /// private string stationTextBlock; public string StationTextBox { get { return stationTextBlock; } set { stationTextBlock = value; OnPropertyChanged("StationTextBox"); } } /// /// PlanDataGrid /// private ObservableCollection prodPLanInfoDataGrid = new ObservableCollection(); public ObservableCollection ProdPLanInfoDataGrid { get { return prodPLanInfoDataGrid; } set { prodPLanInfoDataGrid = value; OnPropertyChanged("ProdPLanInfoDataGrid"); } } /// /// DetailDataGrid /// private ObservableCollection prodPLanDetailDataGrid = new ObservableCollection(); public ObservableCollection ProdPLanDetailDataGrid { get { return prodPLanDetailDataGrid; } set { ProdPLanDetailDataGrid = value; OnPropertyChanged("ProdPLanDetailDataGrid"); } } /// /// 选中行 /// public ProdPLanInfo _selectedRow; public ProdPLanInfo SelectedRow { get { return _selectedRow; } set { _selectedRow = value; OnPropertyChanged(nameof(SelectedRow)); } } /// /// 订单Text /// private string orderCodeText; public string OrderCodeText { get { return orderCodeText; } set { orderCodeText = value; OnPropertyChanged("OrderCodeText"); } } /// /// 工单Text /// private string planCodeText; public string PlanCodeText { get { return planCodeText; } set { planCodeText = value; OnPropertyChanged("PlanCodeText"); } } /// /// 原料Text /// private string materialNameText; public string MaterialNameText { get { return materialNameText; } set { materialNameText = value; OnPropertyChanged("MaterialNameText"); } } /// /// 工位列表 /// private List stationList; public List StationList { get { return stationList; } set { stationList = value; OnPropertyChanged("StationList");} } /// /// 订单 /// private string stationCodeText; public string StationCodeText { get { return stationCodeText; } set { stationCodeText = value; OnPropertyChanged("StationCodeText"); } } #endregion public ExecuteViewModel() { _logger = App.ServiceProvider.GetService>(); _prodPlanInfoService = App.ServiceProvider.GetService(); _prodPlanDetailService = App.ServiceProvider.GetService(); _recordStaffAttendanceService = App.ServiceProvider.GetService(); _RfidHandleBusniess = App.ServiceProvider.GetService(); _baseStaffService = App.ServiceProvider.GetService(); _serialPortBusiness = App.ServiceProvider.GetService(); _databaseHandleBusniess = App.ServiceProvider.GetService(); IConfigurationBuilder configurationBuilder = new ConfigurationBuilder() .SetBasePath(System.AppContext.BaseDirectory) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); IConfigurationRoot configuration = configurationBuilder.Build(); pLanInfo = _prodPlanInfoService.GetRecordStaffAttendancesByConditions("", "", "", "", "1").FirstOrDefault(); Refresh(pLanInfo); havePlanOnDuty(); // 从配置文件中获取ProductLineNameTextBlock的值 //stationTextBlock = configuration.GetSection("AppConfig")["ProductLineName"]; //StationCodes = configuration.GetSection("AppConfig")["StationCode"]; //EmployeeLoginViewModel.TransmitStationNameAction += info => { // stationTextBlock = info; //}; //StationList = ConvertStringToList(StationCodes); //RfidHandleBusniess.stationCode = StationCodes; EmployeeLoginViewModel.TransmitStationNameAction += stationName => { updateStationName(stationName); }; DeviceCode = configuration.GetSection("AppConfig")["DeviceCode"]; ProcessCode = configuration.GetSection("AppConfig")["ProcessCode"]; HandoverCommand = new RelayCommand(Handover); ProductionReportCommand = new RelayCommand(ProductionReport); TechnologicalInformationCommand = new RelayCommand(TechnologicalInformation); SearchCommand = new RelayCommand(Search); ExecuteCommand = new RelayCommand(Execute); ProductionReportViewModel.RefreshDelegateEvent += Refresh; EmployeeLoginViewModel.TransmitUserDelegateEvent += ShowTeamMember; //SerialPortBusiness.ReceivedBarcodeInfoEvent += HandleOrderCode; MainWindowViewModel.TransferOrderCodeEvent += HandleOrderCode; } /// /// 是否有计划正在执行 /// private void havePlanOnDuty() { haveInfo = _prodPlanInfoService.GetPlanInfoByConditions("", "", "", "", "1").FirstOrDefault(); if (haveInfo != null) { isComplete = false; }else { isComplete = true; } } /// /// 更新工位名称 /// /// private void updateStationName(string stationName) { StationTextBox = EmployeeLoginViewModel.stationName; } /// /// 换班弹窗 /// private void Handover() { var handOverWin = new HandOverWin(); handOverWin.Owner = Application.Current.MainWindow; // 设置父窗口为当前主窗口 handOverWin.WindowStartupLocation = WindowStartupLocation.CenterScreen; // 让窗体出现在屏幕中央 handOverWin.ShowDialog();//窗体出现后禁止后面的用户控件 } /// /// 报工弹窗 /// private void ProductionReport() { if (RfidHandleBusniess.stationCode != "") { pLanInfo = _prodPlanInfoService.GetRecordStaffAttendancesByConditions("", "", "", RfidHandleBusniess.stationCode, "1").FirstOrDefault(); if (pLanInfo != null) { MainWindowViewModel.wins = 3; var reportWin = new ProductionReportWin(); reportWin.Owner = Application.Current.MainWindow; // 设置父窗口为当前主窗口 reportWin.WindowStartupLocation = WindowStartupLocation.CenterScreen; // 让窗体出现在屏幕中央 reportWin.ShowDialog();//窗体出现后禁止后面的用户控件 Refresh(pLanInfo); ShowTeamMember(); if (stations >= 3) { _databaseHandleBusniess.UpdateOrderInfoStatus(theOrderCode, "2"); } MainWindowViewModel.wins = 1; } else { MessageBox.Show("没有待执行或执行中的工单!"); } } else { MessageBox.Show("未选择工位没有班组上班!"); } } /// /// 工艺信息弹窗,单例模式保证只显示一个 /// private static TechnologicalWin instance; private void TechnologicalInformation() { if (instance == null) { instance = new TechnologicalWin(); instance.WindowStartupLocation = WindowStartupLocation.CenterScreen; instance.Closed += (sender, e) => { instance = null; }; // 窗口关闭时重置instance为null,以便下次可以重新打开窗口 instance.Show(); } else { instance.Focus(); // 如果窗口已经存在,则将焦点放在该窗口上 } } /// /// 检索事件 /// private void Search() { if (EmployeeLoginViewModel.isOnDuty == true) { //在这里执行其他操作,可以通过InputText获取用户输入的信息 //Console.WriteLine("用户输入的信息:" + OrderCodeTextBox + PlanCodeTextBox + MaterialCodeTextBox); //ProductLineNameTextBlock = ConfigurationManager.AppSettings["ProductLineNameTextBlock"]; List list = _prodPlanInfoService.GetRecordStaffAttendancesByConditions(OrderCodeTextBox, PlanCodeTextBox, MaterialCodeTextBox, RfidHandleBusniess.stationCode, "0"); System.Windows.Application.Current.Dispatcher.Invoke((Action)(async () => { ProdPLanInfoDataGrid.Clear(); list.ForEach(item => { ProdPLanInfoDataGrid.Add(item); }); })); isSearch = 1; } else { MessageBox.Show("没有班组上班,请先打卡上班!"); } } /// /// 根据订单单号判断是否存在, /// private void HandleOrderCode(string orderCode) { theOrderCode = orderCode; if (isComplete) { if (isSearch == 1) { //更新当前工单状态 _databaseHandleBusniess.UpdateOrderInfoStatus(orderCode,"1"); //判断当前工位的工单编号是否存在 var plan = _prodPlanInfoService.GetProdPLanInfoByOrderCode(RfidHandleBusniess.stationCode, orderCode); if (plan == null)//不存在,就在生产工单表中新增一条当前工位的订单,且执行状态改为4,重新检索,并高亮这条工单,执行按钮可用 { foreach(var item in RfidHandleBusniess.stationList) { //现扫描一个订单码,同时插入三张(出布包胶成型)工单表 _databaseHandleBusniess.AddNewPlanInfo(orderCode, item , DeviceCode, ProcessCode, "0"); } } else//存在,将本条数据的执行状态改为4高亮这条工单,执行按钮可用 { //判断这条工单状态是否为待执行或未执行 //var info = _databaseHandleBusniess.SelectPlanStatus(orderCode, RfidHandleBusniess.stationCode, DeviceCode, ProcessCode, "0"); if (plan.PlanStatus != "2") { _databaseHandleBusniess.UpdatePlanStatus(orderCode, RfidHandleBusniess.stationCode, DeviceCode, ProcessCode, "4"); } else { MessageBox.Show("此工单已完成"); } } Search(); } //else //{ // MessageBox.Show("请先检索工单!"); //} } else { MessageBox.Show("请先完成当前工单!"); } } /// /// 新增的执行事件 /// private void Execute() { //判断是否有班组当班,查询打卡记录表,4小时内最后一次打卡类型为上班的班组 if(EmployeeLoginViewModel.isOnDuty == true) { if (isComplete)//判断是否完成,未完成不能执行其他工单 { try { // 将当前记录存为实体,可以通过parameter获取当前记录的信息 string orderCode = _selectedRow.OrderCode.ToString(); string planCode = _selectedRow.PlanCode.ToString(); pLanInfo = _prodPlanInfoService.GetRecordStaffAttendancesByConditions(orderCode, planCode, "", "", "0").First(); //RecordStaffAttendance currentRecord = _recordStaffAttendanceService.GetLastestOnRecord(); //BaseStaffInfo staffInfo = _baseStaffService.GetMonitorByTeamCode(currentRecord.TeamCode); RecordStaffAttendance nextRecord = _recordStaffAttendanceService.GetLastestOffRecord(); // 向detail表里插入一条数据 ProdPlanDetail prodPlanDetail = new ProdPlanDetail { PlanCode = pLanInfo.PlanCode, MaterialCode = pLanInfo.MaterialCode, PlanAmount = pLanInfo.PlanAmount, CompleteAmount = pLanInfo.CompleteAmount, BeginTime = DateTime.Now.ToString(), //CurrentStaffId = staffInfo.StaffId //NextStaffId = nextRecord.StaffId, }; _prodPlanDetailService.Insert(prodPlanDetail); //按钮文字变成执行中并锁定,其他的订单执行按钮也禁用 //pLanInfo.BeginTime = DateTime.Now.ToString(); pLanInfo.PlanStatus = "1"; _prodPlanInfoService.Update(pLanInfo); Search(); //查明细表显示出来 Refresh(pLanInfo); isComplete = false; } catch (Exception ex) { _logger.LogError("执行异常", ex); } } else { MessageBox.Show("请先完成当前工单!"); } } } //刷新明细 private void Refresh(ProdPLanInfo pLanInfo) { if(pLanInfo != null) { List planDetails = _prodPlanDetailService.GetPlanDetailsByPlanCode(pLanInfo.PlanCode); if (planDetails.Count != 0) { var planDetail = planDetails.FirstOrDefault(); PlanCodeText = planDetail.PlanCode; OrderCodeText = pLanInfo.OrderCode; MaterialNameText = pLanInfo.MaterialName; StationCodeText = pLanInfo.StationCode; System.Windows.Application.Current.Dispatcher.Invoke((Action)(async () => { ProdPLanDetailDataGrid.Clear(); planDetails.ForEach(item => { ProdPLanDetailDataGrid.Add(item); }); //ProdPLanDetailDataGrid.Add(planDetail); })); } } //else //{ // PlanCodeText = ""; // OrderCodeText = ""; // MaterialCodeText = ""; // StationCodeText = ""; // System.Windows.Application.Current.Dispatcher.Invoke((Action)(async () => // { // ProdPLanDetailDataGrid.Clear(); // })); //} } /// /// 显示班组成员 /// /// private void ShowTeamMember() { TeamMember = _RfidHandleBusniess.SpliceTeamMember(); } /// /// 将字符串转换为列表 /// /// /// private List ConvertStringToList(string input) { // 使用逗号分隔字符串并转换为列表 List list = new List(input.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)); return list; } public void OnPropertyChanged([CallerMemberName] string propertyName = "") { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } }