diff --git a/SlnMesnac.Business/business/DatabaseHandleBusniess.cs b/SlnMesnac.Business/business/DatabaseHandleBusniess.cs index b4d71ea..3e0c41e 100644 --- a/SlnMesnac.Business/business/DatabaseHandleBusniess.cs +++ b/SlnMesnac.Business/business/DatabaseHandleBusniess.cs @@ -190,6 +190,15 @@ namespace SlnMesnac.Business.business return monitorInfo; } + /// + /// 获取最后一条明细的结束时间 + /// + public ProdPlanDetail GetLastDetailEndTime(string planCode) + { + ProdPlanDetail prodPlanDetail = new ProdPlanDetail(); + prodPlanDetail = _prodPlanDetailService.GetLastPlanDetailByPlanCode(planCode); + return prodPlanDetail; + } ///// ///// 设置员工下班时间 ///// diff --git a/SlnMesnac.Repository/service/Impl/ProdPlanDetailServiceImpl.cs b/SlnMesnac.Repository/service/Impl/ProdPlanDetailServiceImpl.cs index adafd0a..99d3d9e 100644 --- a/SlnMesnac.Repository/service/Impl/ProdPlanDetailServiceImpl.cs +++ b/SlnMesnac.Repository/service/Impl/ProdPlanDetailServiceImpl.cs @@ -49,18 +49,42 @@ namespace SlnMesnac.Repository.service.Impl public List GetPlanDetailsByPlanCode(string planCode) { - List prodPlanDetails = _rep.AsQueryable().WhereIF(!string.IsNullOrEmpty(planCode),x=>x.PlanCode == planCode).OrderByDescending(x => x.ObjId).ToList(); + List prodPlanDetails = new List(); + try + { + prodPlanDetails = _rep.AsQueryable().WhereIF(!string.IsNullOrEmpty(planCode), x => x.PlanCode == planCode).OrderByDescending(x => x.ObjId).ToList(); + } + catch (Exception ex) + { + _logger.LogError($"查询对应计划的所有明细异常:{ex.Message}"); + throw; + } return prodPlanDetails; } + public ProdPlanDetail GetLastPlanDetailByPlanCode(string planCode) + { + ProdPlanDetail prodPlanDetail = new ProdPlanDetail(); + try + { + prodPlanDetail = _rep.AsQueryable().WhereIF(!string.IsNullOrEmpty(planCode), x => x.PlanCode == planCode).OrderByDescending(x => x.EndTime).First(); + } + catch (Exception ex) + { + _logger.LogError($"查询对应计划的最新一条明细异常:{ex.Message}"); + throw; + } + return prodPlanDetail; + } + public bool DeleteByPlanCodeBatchNumber(string planCode, int number) { bool result = false; try { //_rep.AsQueryable().WhereIF(!string.IsNullOrEmpty(planCode), x => x.PlanCode == planCode && x.BatchNumber == number).OrderByDescending(x => x.ObjId).First(); - ProdPlanDetail temp = _rep.AsQueryable().Where(x => x.PlanCode == planCode && x.BatchNumber == number).OrderByDescending(x => x.ObjId).First(); - result = _rep.Delete(temp); + List tempList = _rep.AsQueryable().Where(x => x.PlanCode == planCode && x.BatchNumber == number).OrderByDescending(x => x.ObjId).ToList(); + result = _rep.Delete(tempList); } catch (Exception ex) { diff --git a/SlnMesnac.Repository/service/ProdPlanDetailService.cs b/SlnMesnac.Repository/service/ProdPlanDetailService.cs index 4ece434..f4fc1de 100644 --- a/SlnMesnac.Repository/service/ProdPlanDetailService.cs +++ b/SlnMesnac.Repository/service/ProdPlanDetailService.cs @@ -29,6 +29,13 @@ namespace SlnMesnac.Repository.service /// List GetPlanDetailsByPlanCode(string planCode); + /// + /// 根据计划编号查询最新的一条明细 + /// + /// + /// + ProdPlanDetail GetLastPlanDetailByPlanCode(string planCode); + /// /// 根据工单号删除锅数为0的明细 /// diff --git a/SlnMesnac.WPF/UserControls/EmployeeLoginPage.xaml b/SlnMesnac.WPF/UserControls/EmployeeLoginPage.xaml index 9cc2138..9c54d10 100644 --- a/SlnMesnac.WPF/UserControls/EmployeeLoginPage.xaml +++ b/SlnMesnac.WPF/UserControls/EmployeeLoginPage.xaml @@ -157,7 +157,7 @@ RowHeight="35" AutoGenerateColumns="False" RowHeaderWidth="0" GridLinesVisibility="None" ScrollViewer.HorizontalScrollBarVisibility="Hidden" BorderThickness="0" CanUserAddRows="False" - Foreground="#FFFFFF" SelectedItem="{Binding SelectedDataItem}"> + Foreground="#FFFFFF" > diff --git a/SlnMesnac.WPF/UserControls/ExecutePage.xaml b/SlnMesnac.WPF/UserControls/ExecutePage.xaml index 781ec23..5ec983e 100644 --- a/SlnMesnac.WPF/UserControls/ExecutePage.xaml +++ b/SlnMesnac.WPF/UserControls/ExecutePage.xaml @@ -338,11 +338,11 @@ - diff --git a/SlnMesnac.WPF/ViewModel/ExecuteViewModel.cs b/SlnMesnac.WPF/ViewModel/ExecuteViewModel.cs index 1977c01..6c2331a 100644 --- a/SlnMesnac.WPF/ViewModel/ExecuteViewModel.cs +++ b/SlnMesnac.WPF/ViewModel/ExecuteViewModel.cs @@ -38,6 +38,7 @@ namespace SlnMesnac.WPF.ViewModel private RfidHandleBusniess _RfidHandleBusniess; private DatabaseHandleBusniess _databaseHandleBusniess; private ProdPlanInfoService _prodPlanInfoService; + private ProdOrderInfoService _prodOrderInfoService; private List prodPlanInfos; private ProdPlanDetailService _prodPlanDetailService; private IRecordStaffAttendanceService _recordStaffAttendanceService; @@ -48,7 +49,7 @@ namespace SlnMesnac.WPF.ViewModel private string ProcessCode; public static bool isComplete = true; public static string theStartTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");//记录每个明细的开始时间 - public static string intervalvalTime = "2023-11-11 00:00:00"; + //public static string intervalvalTime = "2023-11-11 00:00:00"; public static int stations = 0; private string theOrderCode = ""; private ProdPLanInfo pLanInfo; @@ -57,6 +58,7 @@ namespace SlnMesnac.WPF.ViewModel private string executeText = "待执行"; private int isSearch = 0; public static string lastReportTime; + private int refreshOrNot = 1;//是否刷新 //public static string batchNums = "";//批次 #region 定义命令 @@ -95,6 +97,8 @@ namespace SlnMesnac.WPF.ViewModel public delegate void RefreshDelegate(ProdPLanInfo pLanInfo); public static event RefreshDelegate? RefreshEvent; + public static Action ClearOrderCodeAction; + /// /// 按钮文字转换事件 /// @@ -139,9 +143,16 @@ namespace SlnMesnac.WPF.ViewModel public string MaterialCodeTextBox { get { return materialCodeTextBox; } - set { materialCodeTextBox = value; OnPropertyChanged("MaterialNameTextBox"); } + set { materialCodeTextBox = value; OnPropertyChanged("MaterialCodeTextBox"); } } + //private string materialNameTextBox; + //public string MaterialNameTextBox + //{ + // get { return materialNameTextBox; } + // set { materialNameTextBox = value; OnPropertyChanged("MaterialNameTextBox"); } + //} + /// /// 工位 /// @@ -201,7 +212,7 @@ namespace SlnMesnac.WPF.ViewModel /// /// 订单Text /// - private string orderCodeText; + private string orderCodeText = string.Empty; public string OrderCodeText { get { return orderCodeText; } @@ -271,8 +282,10 @@ namespace SlnMesnac.WPF.ViewModel public ExecuteViewModel() { + _logger = App.ServiceProvider.GetService>(); _prodPlanInfoService = App.ServiceProvider.GetService(); + _prodOrderInfoService = App.ServiceProvider.GetService(); _prodPlanDetailService = App.ServiceProvider.GetService(); _recordStaffAttendanceService = App.ServiceProvider.GetService(); _recordStaffRealTimeService = App.ServiceProvider.GetService(); @@ -299,6 +312,12 @@ namespace SlnMesnac.WPF.ViewModel { updateStationName(stationName); }; + ProductionReportViewModel.RefrashClearAction += num => + { + refreshOrNot = num; + Clear(); + } + ; DeviceCode = configuration.GetSection("AppConfig")["DeviceCode"]; ProcessCode = configuration.GetSection("AppConfig")["ProcessCode"]; HandoverCommand = new RelayCommand(Handover); @@ -368,7 +387,6 @@ namespace SlnMesnac.WPF.ViewModel StationTextBox = EmployeeLoginViewModel.stationName; } - /// /// 换班弹窗 /// @@ -396,7 +414,11 @@ namespace SlnMesnac.WPF.ViewModel reportWin.WindowStartupLocation = WindowStartupLocation.CenterScreen; // 让窗体出现在屏幕中央 reportWin.ShowDialog();//窗体出现后禁止后面的用户控件 Search(); - Refresh(pLanInfo); + if (refreshOrNot == 1) + { + Refresh(pLanInfo); + } + refreshOrNot = 1; ShowTeamMember(); if (stations >= 3) { @@ -468,42 +490,46 @@ namespace SlnMesnac.WPF.ViewModel /// private void HandleOrderCode(string orderCode) { - theOrderCode = orderCode; if (isComplete) { - if (isSearch == 1) + var order = _prodOrderInfoService.GetProdOrderInfoByOrderCode(orderCode); + if (order != null) { - //更新当前工单状态 - _databaseHandleBusniess.UpdateOrderInfoStatus(orderCode,"1"); - //判断当前工位的工单编号是否存在 - var plan = _prodPlanInfoService.GetProdPLanInfoByOrderCode(RfidHandleBusniess.stationCode, orderCode); - if (plan == null)//不存在,就在生产工单表中新增一条当前工位的订单,且执行状态改为4,重新检索,并高亮这条工单,执行按钮可用 + if (isSearch == 1) { - foreach(var item in RfidHandleBusniess.stationList) + ClearOrderCodeAction?.Invoke(); + //更新当前工单状态 + _databaseHandleBusniess.UpdateOrderInfoStatus(order.OrderCode, "1"); + //判断当前工位的工单编号是否存在 + var plan = _prodPlanInfoService.GetProdPLanInfoByOrderCode(RfidHandleBusniess.stationCode, order.OrderCode); + if (plan == null)//不存在,就在生产工单表中新增一条当前工位的订单,且执行状态改为4,重新检索,并高亮这条工单,执行按钮可用 { - //现扫描一个订单码,同时插入三张(出布包胶成型)工单表 - _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"); + foreach (var item in RfidHandleBusniess.stationList) + { + //现扫描一个订单码,同时插入三张(出布包胶成型)工单表 + _databaseHandleBusniess.AddNewPlanInfo(order.OrderCode, item, DeviceCode, ProcessCode, "0"); + } } - else + else//存在,将本条数据的执行状态改为4高亮这条工单,执行按钮可用 { - MessageBox.Show("此工单已完成"); + //判断这条工单状态是否为待执行或未执行 + //var info = _databaseHandleBusniess.SelectPlanStatus(orderCode, RfidHandleBusniess.stationCode, DeviceCode, ProcessCode, "0"); + if (plan.PlanStatus != "2") + { + _databaseHandleBusniess.UpdatePlanStatus(order.OrderCode, RfidHandleBusniess.stationCode, DeviceCode, ProcessCode, "4"); + } + else + { + MessageBox.Show("此工单已完成"); + } } + Search(); } - Search(); } - //else - //{ - // MessageBox.Show("请先检索工单!"); - //} + else + { + MessageBox.Show("此订单不存在,请联系管理员!"); + } } else { @@ -524,6 +550,9 @@ namespace SlnMesnac.WPF.ViewModel { try { + + var Info = OrderCodeText.GetHashCode(); + // 将当前记录存为实体,可以通过parameter获取当前记录的信息 string orderCode = _selectedRow.OrderCode.ToString(); string planCode = _selectedRow.PlanCode.ToString(); @@ -605,6 +634,18 @@ namespace SlnMesnac.WPF.ViewModel //} } + /// + /// 清空右边信息和明细 + /// + private void Clear() + { + PlanCodeText = ""; + OrderCodeText = ""; + MaterialNameText = ""; + ProdPLanDetailDataGrid.Clear(); + + } + /// /// 显示班组成员 /// diff --git a/SlnMesnac.WPF/ViewModel/MainWindowViewModel.cs b/SlnMesnac.WPF/ViewModel/MainWindowViewModel.cs index 080e0eb..5a46793 100644 --- a/SlnMesnac.WPF/ViewModel/MainWindowViewModel.cs +++ b/SlnMesnac.WPF/ViewModel/MainWindowViewModel.cs @@ -173,6 +173,7 @@ namespace SlnMesnac.WPF.ViewModel { info = OrderCodeText; }; + ExecuteViewModel.ClearOrderCodeAction += ClearOrderCode; } /// @@ -209,6 +210,14 @@ namespace SlnMesnac.WPF.ViewModel } #endregion + /// + /// 清空订单编码 + /// + private void ClearOrderCode() + { + OrderCodeText = ""; + } + /// /// 窗体控制 /// diff --git a/SlnMesnac.WPF/ViewModel/ProductionReportViewModel.cs b/SlnMesnac.WPF/ViewModel/ProductionReportViewModel.cs index fae8d10..cbe5fb8 100644 --- a/SlnMesnac.WPF/ViewModel/ProductionReportViewModel.cs +++ b/SlnMesnac.WPF/ViewModel/ProductionReportViewModel.cs @@ -29,6 +29,7 @@ namespace SlnMesnac.WPF.ViewModel private double newAmountDouble; private double result; + #region /// /// 按钮文字转换事件 @@ -38,6 +39,8 @@ namespace SlnMesnac.WPF.ViewModel //刷新委托 public delegate void RefreshDelegate(ProdPLanInfo pLanInfo); public static event RefreshDelegate RefreshDelegateEvent; + + public static Action? RefrashClearAction; #endregion public ProductionReportViewModel() @@ -60,7 +63,7 @@ namespace SlnMesnac.WPF.ViewModel private void Init() { - planInfo = _prodPlanInfoService.GetRecordStaffAttendancesByConditions("", "", "", RfidHandleBusniess.stationCode, "1").FirstOrDefault(); + planInfo = _prodPlanInfoService.GetPlanInfoByConditions("", "", "", RfidHandleBusniess.stationCode, "1").FirstOrDefault(); if (planInfo != null) { complateRate = GetComplateRate(Convert.ToDouble(planInfo.CompleteAmount), planInfo.PlanAmount); @@ -158,90 +161,88 @@ namespace SlnMesnac.WPF.ViewModel /// private void Confirm() { - DateTime startTime = DateTime.Parse(ExecuteViewModel.intervalvalTime); - if ((DateTime.Now - startTime).TotalMinutes > 15) + // 获取最新工单明细的结束时间 + var detail = _databaseHandleBusniess.GetLastDetailEndTime(planInfo.PlanCode); + + // 如果最新工单明细没有结束时间,跳过时间判断 + if (!string.IsNullOrEmpty(detail.EndTime)) { - if (EmployeeLoginViewModel.isOnDuty == true)//是否有班组当班,无当班时操作无效 + DateTime startTime = DateTime.Parse(detail.EndTime); + if ((DateTime.Now - startTime).TotalMinutes <= 15) { - var monitor = _databaseHandleBusniess.GetMonitor(RfidHandleBusniess.stationCode); - if (monitor != null) - { - string newAmount = NewAmountText; - RfidHandleBusniess.theNewAmount = NewAmountText; - if (newAmount != "") - { - bool isNum = true; - foreach (char x in newAmount) - { - if (!char.IsNumber(x) && x != '.') - { - isNum = false; - } - } - if (isNum) - { - HintText = "请撤回最新工单明细!"; - //将新增产量加到实际产量中 - currentAmountDouble = Convert.ToDouble(planInfo.CompleteAmount); - newAmountDouble = Convert.ToDouble(newAmount); - result = currentAmountDouble + newAmountDouble; - //planDetail = new ProdPlanDetail(); - planDetail.CurrentStaffId = monitor.staffId;//取班长ID - planDetail.CreatedBy = monitor.staffName;//存班长名 - planDetail.CompleteAmount = newAmountDouble.ToString(); - planInfo.CompleteAmount = result.ToString(); - if (planDetail.EndTime == null)//第一条明细 - { - planDetail.BeginTime = ExecuteViewModel.theStartTime; - } - else - { - planDetail.BeginTime = planDetail.EndTime; - } - planDetail.EndTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); - ExecuteViewModel.intervalvalTime = planDetail.EndTime; - planDetail.BatchNumber += 1; - //ExecuteViewModel.batchNums = planDetail.BatchNumber.ToString(); - //保存工单的执行人员 - List realTimes = _databaseHandleBusniess.GetRecordStaffRealTimes(); - _prodPlanDetailService.Insert(planDetail); - _prodPlanInfoService.Update(planInfo); - _databaseHandleBusniess.InsertPlanExecuteUser(planInfo, planDetail, realTimes); - Refresh(); - HintText = "已提交!"; - RefreshDelegateEvent?.Invoke(planInfo); - //ExecuteViewModel.isComplete = true; - complateRate = GetComplateRate(result, PlanAmountText); - if (complateRate > 0.9) - { - EndButtonColor = "#FF11B514"; - } - } - else - { - //提示框提示错误信息 - HintText = "输入有误,请输入阿拉伯数字!"; - } - } - else - { - HintText = "不能为空!"; - } - } - else - { - HintText = "班长未打卡,无法执行此操作!"; - } - } - else - { - HintText = "没有班组当班,无法执行此操作!"; + HintText = "当前工单距离上次提交不足15分钟!"; + return; } } - else + + // 如果没有班组当班,直接返回 + if (!EmployeeLoginViewModel.isOnDuty) { - HintText = "当前工单距离上次提交不足15分钟!"; + HintText = "没有班组当班,无法执行此操作!"; + return; } + + // 获取班组长信息 + var monitor = _databaseHandleBusniess.GetMonitor(RfidHandleBusniess.stationCode); + if (monitor == null) + { + HintText = "班长未打卡,无法执行此操作!"; + return; + } + + // 获取新输入的产量 + string newAmount = NewAmountText?.Trim(); + if (string.IsNullOrEmpty(newAmount)) + { + HintText = "不能为空!"; + return; + } + + // 验证输入的产量是否为数字 + if (!IsNumeric(newAmount)) + { + HintText = "输入有误,请输入阿拉伯数字!"; + return; + } + + // 更新计划信息 + RfidHandleBusniess.theNewAmount = newAmount; + double currentAmountDouble = Convert.ToDouble(planInfo.CompleteAmount); + double newAmountDouble = Convert.ToDouble(newAmount); + double result = currentAmountDouble + newAmountDouble; + + // 设置工单明细 + planDetail.CurrentStaffId = monitor.staffId; // 班长ID + planDetail.CreatedBy = monitor.staffName; // 班长名称 + planDetail.CompleteAmount = newAmountDouble.ToString(); + planInfo.CompleteAmount = result.ToString(); + planDetail.BeginTime = planDetail.EndTime ?? ExecuteViewModel.theStartTime; + planDetail.EndTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + planDetail.BatchNumber += 1; + + // 保存数据 + var realTimes = _databaseHandleBusniess.GetRecordStaffRealTimes(); + _prodPlanDetailService.Insert(planDetail); + _prodPlanInfoService.Update(planInfo); + _databaseHandleBusniess.InsertPlanExecuteUser(planInfo, planDetail, realTimes); + + // 刷新并更新UI + Refresh(); + HintText = "已提交!"; + RefreshDelegateEvent?.Invoke(planInfo); + + // 更新完成率 + complateRate = GetComplateRate(result, PlanAmountText); + if (complateRate > 0.9) + { + EndButtonColor = "#FF11B514"; + } + } + + // 检查字符串是否为有效数字 + private bool IsNumeric(string value) + { + return value.All(c => char.IsDigit(c) || c == '.'); } /// @@ -250,45 +251,53 @@ namespace SlnMesnac.WPF.ViewModel public ICommand EndPlanCommand { get; private set; } private void EndPlan() { - //判断工单实际产量与目标产量的差距,满足才能执行结束 + // 判断工单实际产量与目标产量的差距,满足才能执行结束 if (complateRate > 0.9) { - if (EmployeeLoginViewModel.isOnDuty == true)//是否有班组当班,无当班时操作无效 + if (EmployeeLoginViewModel.isOnDuty == true) // 是否有班组当班,无当班时操作无效 { if (planDetail != null && planInfo != null) { - //planDetail.EndTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + // planDetail.EndTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); //_prodPlanDetailService.Insert(planDetail); planInfo.PlanStatus = "2"; planInfo.EndTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + double planAmountDouble = Convert.ToDouble(planInfo.PlanAmount); double completeAmountDouble = Convert.ToDouble(planInfo.CompleteAmount); + ExecuteViewModel.isComplete = true; - if (planAmountDouble == completeAmountDouble) + + // 使用 switch-case 来处理完成情况 + switch (planAmountDouble.CompareTo(completeAmountDouble)) { - planInfo.CompFlag = "0";//正常完成 - } - else if (planAmountDouble > completeAmountDouble) - { - planInfo.CompFlag = "1";//不足目标产量降级处理 - } - else - { - planInfo.CompFlag = "2";//超额完成 + case 0: // 完成量等于计划量 + planInfo.CompFlag = "0"; // 正常完成 + break; + case int n when (n > 0): // 完成量小于计划量 + planInfo.CompFlag = "1"; // 不足目标产量降级处理 + break; + case int n when (n < 0): // 完成量大于计划量 + planInfo.CompFlag = "2"; // 超额完成 + break; } + _prodPlanInfoService.Update(planInfo); ExecuteViewModel.stations += 1; } - //关闭窗口 + + // 关闭窗口 Application.Current.Windows.OfType().First().Close(); + RefrashClearAction?.Invoke(0); } } else { MessageBox.Show("完成产量与计划数量差距过大!"); - } + } } + /// /// 继续执行 /// @@ -310,6 +319,7 @@ namespace SlnMesnac.WPF.ViewModel ExecuteViewModel.isComplete = true; //关闭窗口 Application.Current.Windows.OfType().First().Close(); + RefrashClearAction?.Invoke(0); }